装饰者模式顾名思义就是在一个类对象的基础上再包装一层,使得这个类的功能得以扩展,符合了设计原则中的禁止修改,提倡扩展的开闭原则。说到给类扩展其功能,可能大家也会想到代理模式,代理模式是关注在控制对对象的访问的,而装饰者模式可以动态地给类对象添加若干个功能,装饰者模式能分离出装饰者对于被装饰者的业务逻辑。

下面我们来看下实例代码吧

这里我们以买煎饼果子为例子吧,比如我们现在要去街边买一个煎饼果子,有鸡蛋和香肠这两种辅料添加

那么我们先创建一个抽象的煎饼类,里面有煎饼的描述,煎饼的价格信息

然后我们构建一个具体的原味煎饼:这个原味煎饼因为现在暂时什么辅料都没加,所以描述信息就是煎饼,价格是8块。

那么现在我们就要创建一个装饰者了,首先创建一个抽象的装饰者,这个抽象的装饰者里面有一个煎饼对象的成员变量,我们所有的具体装饰类都要继承于这个抽象的装饰者,我们可以想象成一个这个抽象的装饰者就是对一个煎饼对象包装的一层假的装饰,这个装饰是什么都没有的,具体的装饰得交给具体的装饰类去做

创建具体的装饰类(加蛋装饰,加香肠装饰)

通过上面两个具体的装饰类我们应该能明白抽象的装饰类做的就是我们把具体的被装饰类通过具体的装饰类构造函数的参数传入,然后我们在具体的装饰类里面重写抽象的装饰类的接口的方法,这时候具体的装饰就是在这些重写的方法里面实现了,因为这时重写的方法里面调用了父类的方法(抽象的装饰者中的方法,这些方法里面调用的是具体的被装饰类的方法),然后我们这时候再加上自己装饰的信息就完成了对被装饰者装饰的装饰者类了,其实我们这里可以这样理解,抽象的装饰类其实就是一个桥梁,什么桥梁尼?就是我们的装饰者能去装饰被装饰者之间的一个桥梁,装饰者要通过这个桥梁才能去装饰被装饰者,所以说我们的装饰者类必须要继承于抽象的装饰者类。

调用者可以根据装饰类动态地去装饰被装饰者:

装饰者模式总结: 装饰者模式里面其实可以分为4个角色,分别是抽象构建角色,具体构建角色,装饰角色,具体装饰角色

  • 抽象构建角色:通常是指一个抽象类或者一个接口,里面定义了一系列方法,具体指的是具体的被装饰者实现的抽象类或者接口,该抽象类或者接口对于装饰者来说也要继承或者实现。(例如上面例子中的AbstractBatter)
  • 具体构建角色:指的是实现了或者继承了抽象构建角色的子类,在上面的例子中具体指的就是煎饼这个对象。
  • 装饰角色:它是具体装饰角色共同实现的抽象类(也可以是接口),并且持有一个Component类型的对象引用,它的主要作用就是把客户端的调用委派到被装饰类。所有的装饰者类都要继承于这个装饰角色。
  • 具体装饰角色:继承于装饰角色的子类,重写装饰角色实现的接口的方法,在这些重写的方法中去装饰。(例如上面的加蛋装饰者类,加香肠装饰者类)

优点:

  1. 继承的有力补充,比继承灵活,不改变类对象的原始逻辑情况下能扩展类的功能。
  2. 通过各种装饰类的组合,能够使得被装饰类实现不同的效果。

缺点:会出现更多的代码以及更多额类,增加程序的复杂性,在动态装饰时,多层装饰会更复杂。

Java结构型设计模式之装饰者模式相关推荐

  1. 详解设计模式:装饰器模式

    装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...

  2. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  3. javascript设计模式之装饰器模式(结构型模式)

    javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...

  4. 结构型设计模式(二) 之 装饰者模式可给对象一层层加工

    1 定义 装饰者模式(Decorator Pattern)又叫包装模式属于结构型设计模式之一,它主要用于动态地给一个对象增加一些额外扩展的功能,它是继承关系的一个替代方案,且在特定场景中比使用继承生成 ...

  5. JAVA设计模式第三讲:结构型设计模式

    设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...

  6. Java设计模式(三)结构型 设计模式

    设计模式(结构型) 结构型设计模式关注如何将现有的类或对象组织在一起形成更加强大的结构.并且根据我们前面学习的合成复用原则,我们该如何尽可能地使用关联关系来代替继承关系是我们本版块需要重点学习的内容. ...

  7. java设计模式之结构型设计模式

    结构型设计模式: 适配器(Adapter): 用途:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作. 场景: 你想使用一个已经存在的 ...

  8. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  9. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  10. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

最新文章

  1. Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略
  2. 关于Scalability的一些思考与疑问
  3. 【nginx】关于fastcgi_cache
  4. 2016年2月23日----Javascript运算符
  5. @j1 bootstrap
  6. 项目手册 1.0 发布
  7. 用CSS Houdini画一片星空
  8. Julia : 类型别名
  9. 计算机网络下一跳IP,计算机网络之IP地址
  10. 乐优商城遇到的坑(三)之Centos6.5下安装nginx出错
  11. 《 PHP+H5全栈工程师培训项目实战》
  12. 计算机中 b、KB、MB、GB、TB之间的换算关系
  13. 自媒体、新媒体、融媒体的区别是什么?
  14. 全球约有 150 亿台设备在运行 Java,收费后还能用吗?
  15. python如何控制鼠标键盘_Python如何控制鼠标键盘
  16. win7安装Cajviewer后,打开文档,目录注释乱码问题解决
  17. pp模块常用表 sap_SAP PP模块常用T-CODE
  18. 三元赫尔德不等式_赫尔德不等式
  19. Out-Of-Vocabulary(OOV)的理解
  20. php广告联盟,PHPCPS广告联盟系统

热门文章

  1. Mac OS 开启三指拖移,三指缩放,拖拽窗口,切换全面页面变成四指
  2. 算法:回溯五 数组全排列permutations
  3. java 6 基础_java基础(6)
  4. The evolved Transformer,进化的变换器
  5. 146.LRU缓存机制
  6. 降维系列之 LLE 局部线性嵌入
  7. Raki的读paper小记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  8. 记忆测试系统c语言,c语言重点回忆
  9. PHP MD5 SHA1 比较 漏洞绕过
  10. 现代软件工程 第一周博客作业