专栏首页java闲聊设计模式之 装饰器模式

设计模式之 装饰器模式

装饰器模式是为已有功能动态的添加更多功能的一种方式。
  • 优点: 有效的把类的核心职责和装饰功能区分开,职责更细化
  • UML

image.png

  • code public interface Apple { /** * 描述 */ void res(); } public class ConcreteApple implements Apple { @Override public void res() { System.out.println("普通的苹果"); } }
    • 装饰器基类 public abstract class Decorator implements Apple { protected Apple apple; public Decorator(Apple apple) { super(); this.apple = apple; } @Override public void res() { apple.res(); } } public class ConcreteDecoratorA extends Decorator{ public ConcreteDecoratorA(Apple apple) { super(apple); } public void resA(){ System.out.println("被装饰器A扩展的功能"); } @Override public void res(){ System.out.println("装饰器A=>装饰成红色的"); super.res(); System.out.println("装饰器A=>装饰结束"); } } public class ConcreteDecoratorB extends Decorator{ public ConcreteDecoratorB(Apple apple) { super(apple); } public void resB(){ System.out.println("被装饰器B扩展的功能"); } @Override public void res(){ System.out.println("装饰器B=>装饰成绿色的"); super.res(); System.out.println("装饰器B=>装饰结束"); } }
      • 测试 ** * @author tanoak@qq.com * @date 2018/7/26 14:08 * @Desc 装饰器模式 * 1,不改变原类文件。 * 2,不使用继承。 * 3,动态扩展。 */ public class Main { public static void main(String[] args) { Apple apple =new ConcreteApple(); System.out.println("-----------未装饰-------------------\n"); apple.res();//原来的方法 System.out.println("------------------------------------\n"); test2(apple) ; } private static void test2(Apple apple){ ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple); System.out.println("\n-----------装饰后-------------------\n"); decoratorB.res(); System.out.println("------------------------------"); } } 总结
        • 使用场景 当系统需要增加新功能时,向旧的类中添加新的代码,装饰原有类的核心职责或主要行为 eg: 在上述代码中 我想要对苹果的颜色进行包装,但是也会存在不进行包装的情况,核心逻辑是苹果,其次是对苹果进行装饰

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式之抽象工厂模式

    tanoak
  • 设计模式之简单工厂

    编写好之后,来看Main方法,当需要苹果时只需要修改一个参数就行了,并不需要在main方法中new,有小伙伴可能要问了,这代码没变少反而多了,关于这个问题请看设...

    tanoak
  • 设计模式之适配器模式适配器模式

    当我们的手机接口Type-A时,但是数据线只有Type-C的时候,就需要用转接口做适配,这种情况下就要增加一个适配器

    tanoak
  • springboot vue整合websocket

    compile 'org.springframework.boot:spring-boot-starter-websocket'

    似水的流年
  • 程序员该如何管理后宫:皇后造小人(工厂模式)

    木东居士
  • Java 版 C 语言经典 100 例(26 - 30)

    假设第 5 个人为 岁,则第 4 个人为 岁,第 3 个人为 岁,以此类推,第一个人应该是 岁,而第一个人为 10 岁,所以

    村雨遥
  • Java基础-07(02).总结private,this,封装,static,成员方法变量,局部变量匿名对象

    9:面向对象的练习题(掌握) (1)标准的手机类的定义和测试 (2)Demo类有求和方法,Test类进行测试。 什么时候定义成员变量? 当该变量是用来描...

    Java帮帮
  • Java-函数

    方法重载:在同一个类中,出现了方法名相同 不能出现参数名以及参数条件一致的方法 特点:

    DataScience
  • Java自动化测试(循环/条件控制语句 预习3)

    初始化值1->循环终止条件2「true」->循环体3->循环体执行后的语句4 ->循环终止条件2「true」->循环体3->循环体执行后的语句4->…循环终止条...

    zx钟
  • 数据结构——java实现栈

    说故事的五公子

扫码关注云+社区

领取腾讯云代金券