概述

装饰模式主要用来动态的拓展现有的功能。主要包含四个角色,抽象构件 Component,具体构件 ConcreteComponent,抽象装饰类 Decorator,具体装饰类 ConcreteComponent。具体类图可参考类图小节。当需要给已有的具体构件拓展新功能时,增加具体装饰类即可,很灵活。

核心思想

有一个最基础的抽象构件 Component 类,ConcreteComponent 和 Decorator 都继承自 Component,并且 Decorator 聚合 Component。一般情况下,装饰者的构造器需要传入被装饰对象。

类图


从类图可知,ComponentA 和 Decorator 都继承自 Component,并且Decorator 聚合了 Component 类,那么理论上 Component 的子类都能用 Decorator 的子类来装饰,那么拓展新功能时,只需要拓展具体的 Decorator 就可以了,如 DecoratorC、DecoratorD 等等。

优缺点

  • 优点
    动态的给具体构件拓展新功能,解决了继承可能带来的类膨胀问题。
  • 缺点
    从使用上看,装饰类会一层一层的将被装饰类包起来,当出现问题时,刚好问题点在某个比较深的装饰类,那调试查找问题会比较麻烦。

代码实现

Component

public abstract class Component {public abstract void hello();
}

ComponentA

public class ComponentA extends Component {@Overridepublic void hello() {System.out.println("ComponentA#hello()");}
}

Decorator

public abstract class Decorator extends Component {protected Component component;public Decorator(Component component) {this.component = component;}
}

DecoratorA

public class DecoratorA extends Decorator {public DecoratorA(Component component) {super(component);}@Overridepublic void hello() {System.out.println("DecoratorA#hello()");this.component.hello();}
}

DecoratorB

public class DecoratorB extends Decorator {public DecoratorB(Component component) {super(component);}@Overridepublic void hello() {System.out.println("DecoratorB#hello()");this.component.hello();}
}

TestDecorator

public class TestDecorator {public static void main(String[] args) {Component component = new ComponentA(); //待装饰对象component = new DecoratorA(component);  //使用 DecoratorA 对 component 进行装饰component = new DecoratorB(component);  //使用 DecoratorB 对 component 进行装饰component.hello();}
}

运行 TestDecorator 的 main 方法,输出如下,

DecoratorB#hello()
DecoratorA#hello()
ComponentA#hello()

哪里见过这种模式?

在 JDK 中,java.io.Reader,java.io.InputStreamReader,java.io.BufferedReader, 这三个类及它们子类的实现上使用了装饰模式,其类图如下,

这个类图是不是很眼熟,没错,这就是上面的装饰模式的实现类图。可以看到 Reader 是一个最基础的类,InputStreamReader 在这里为被装饰者,BufferedReader 是装饰者。BufferedReader 构造时需要传入 Reader 对象,构造方法实现如下,

即 BufferedReader 聚合了 Reader 对象。

总结

装饰模式主要用来给对象动态拓展功能,在项目开发过程中非常灵活,当需要增加或删除某个功能时,只需要加上或去掉对应的装饰类即可,从装饰模式的类图可以一目了然整体的模式设计。
在 JDK 中也有很多地方用到装饰模式,例如 java.io.Reader 的实现。

下面是公众号,欢迎扫描二维码,感谢关注和支持!
公众号名称:ToSimple

设计模式––装饰模式相关推荐

  1. 设计模式----装饰模式

    设计模式--装饰模式 "装饰模式(Decorator)"又名"包装模式(Wrapper)",通常用来灵活地扩充对象的功能. 在此之前我们可以通过类的继承来扩充父 ...

  2. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  3. 大话设计模式—装饰模式

    装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  4. 设计模式--装饰模式

    目录 什么是装饰模式? 应用代码示例 装饰模式模板 jdk中的装饰模式 为什么装饰器类不能直接实现Component父类? 什么是装饰模式? 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油 ...

  5. C++设计模式-装饰模式

    目录 基本概念 代码和实例 基本概念 装饰模式是为已有功能动态地添加更多功能的一种方式. 当系统需要新功能的时候,是向旧系统的类中添加新代码.这些新代码通常装饰了原有类的核心职责或主要行为. 装饰模式 ...

  6. 李建忠设计模式——装饰模式

    1."单一职责"模式 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Deco ...

  7. C++设计模式——装饰模式(高屋建瓴)

    原网址:https://blog.csdn.net/CoderAldrich/article/details/83115394 重点在于 ConcreteDecoratorA(Component *d ...

  8. java设计模式——装饰模式

    装饰模式也称为包装模式.结构型设计模式之一,其使用一种对客户端透明的方式动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一. 装饰模式可以动态的给一个对象添加一些额外的职责.就增加功能功能来说 ...

  9. 设计模式——装饰模式详解

    0. 前言   写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇 ...

  10. 设计模式 | 装饰模式

    1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求. 相片的 ...

最新文章

  1. 原创 | 从ULMFiT、Transformer、BERT等经典模型看NLP 发展趋势
  2. 开发日记-20190807 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 21
  3. Linux系统休眠(System Suspend)和设备中断处理
  4. POJ-2065 SETI 高斯消元,扩展GCD
  5. form表单提交数据编码方式和tomcat接受数据解码方式
  6. 此次边路调整系统推荐射手走哪路_王者荣耀:S15射手最新梯度排行,马可T2,狄仁杰T1,T0仅剩两位...
  7. jsp连接Sql Server 2000数据库
  8. ram_flash驱动
  9. SQL Server 2014,表变量上的非聚集索引
  10. TCP/IP详解 卷一笔记
  11. deepin linux 安装 磁盘管理,在微软Windows系统上编辑深度Deepin Linux系统的磁盘
  12. 每个人都想知道的W3C(万维网联盟)
  13. 瑞幸的不幸,已可预见
  14. 哈佛结构和冯·诺依曼结构的区别
  15. 代币标准--ERC1155协议源码解析
  16. 【Shiro权限管理】17.Shiro权限注解
  17. 安装android+手机usb+驱动程序,一加手机驱动怎么安装 一加手机USB驱动手动安装详细教程图解...
  18. Angular: Object is possibly ‘null‘
  19. Android应用本地离线激活认证方案—so文件授权认证
  20. 昂首阔步迈入大数据时代

热门文章

  1. 迎来第六位CEO 微软中国进入新时期
  2. linux硬盘恢复软件哪个好用,实用推荐:12款Linux系统恢复工具
  3. 计算机二级基础知识简单汇总
  4. HSSF 读取excel
  5. 计算机社团动员大会发言稿,代表发言稿
  6. (字符串大放异彩)特殊符号库
  7. 防关联指纹浏览器有什么?防指纹浏览器
  8. 不在书店和荒岛图书馆
  9. FO3 辐射3审校心得——初翻太过分了,真该抓去喂乌龟(翻译)
  10. iOS调取本地相册成功之后,显示的相册英文名称变成中文的解决方法