1、概念

装饰模式动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活,属于结构性模式一种。

2、模式结构

  • 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。
  • 具体组件角色(ConcreteComponent) :被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
  • 抽象装饰器(Decorator):维持一个指向构件Component对象的实例,并定义一个与抽象组件角色Component接口一致的接口。
  • 具体装饰器角色(ConcreteDecorator):向组件添加职责。

3、使用场景

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
  • 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类)

4、优缺点

优点:

  • 装饰模式可以提供比继承更多的灵活性
  • 通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为
  • 使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合
  • 具体构件类与具体装饰类可以独立变化,原有代码无须改变,符合“开闭原则”

缺点:

  • 装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度
  • 多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐

5、实例

在购买奶茶的时候,经常会有选择配料的选项,每种配料的价格不一样,可以多种组合,价格也不一样。首先先定义奶茶的接口,具有名称和价格方法

public interface IMilkTea {String name();double price();
}

继承IMilkTea的相关茶类

public class RedTea implements IMilkTea {@Overridepublic String name() {return "红茶";}@Overridepublic double price() {return 10;}
}
public class GreenTea implements IMilkTea {@Overridepublic String name() {return "绿茶";}@Overridepublic double price() {return 12;}
}

定义具体装饰类Decorator,装饰相关奶茶

public class Decorator implements IMilkTea {@Overridepublic String name() {return null;}@Overridepublic double price() {return 0;}
}

继承Decorator的相关类

public class IceCream extends Decorator {private String name = "加雪糕";private IMilkTea milkTea;public IceCream(IMilkTea milkTea) {this.milkTea = milkTea;}@Overridepublic String name() {return milkTea.name() + name;}@Overridepublic double price() {return milkTea.price() + 3;}
}
public class Pearl extends Decorator {private String name = "加珍珠";private IMilkTea milkTea;public Pearl(IMilkTea milkTea) {this.milkTea = milkTea;}@Overridepublic String name() {return milkTea.name() + name;}@Overridepublic double price() {return milkTea.price() + 2;}
}

客户端使用

public static void main(String[] args) {IMilkTea milkTea = new RedTea();milkTea = new IceCream(milkTea);milkTea = new Pearl(milkTea);System.out.println(milkTea.name() + "\n价格:" + milkTea.price());
}

转载于:https://www.cnblogs.com/fomin/p/9933956.html

装饰模式(Decorator)相关推荐

  1. 装饰模式(Decorator)简介

    装饰模式是第三个介绍的模式了. 这个模式没有前面两个那么好理解., 一, 装饰模式(decorator)的定义. 教材里是这样写的: 动态第给1个对象添加1写额外的职责(功能), 就增加的功能来讲, ...

  2. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...

  3. 设计模式(13):结构型-装饰模式(Decorator)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  4. 七、装饰模式(Decorator Pattern)

    一.介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:使用继承实现类的功能的扩展,有时子类会过多的问题. 应用实例: 1.一幅照片,将它放入玻 ...

  5. 装饰模式Decorator

                                                               装饰模式Decorator /*** 抽象构件角色* @author InJava ...

  6. 设计模式之装饰模式(Decorator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. c语言装饰,C++设计模式之装饰模式(Decorator)

    装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类 ...

  8. 《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结

    1. AOP面向方面编程 共性功能 AOP调用示意图 public class SaleModel { private String goods; //销售的商品 public String getG ...

  9. 《研磨设计模式》chap22 装饰模式Decorator(1)模式简介

    场景:算员工奖金,各种奖金,有个人销售奖,团队奖,环比增加销售奖等等 1. 正常编码 public class Prize {//计算某人在某段时间内的奖金,有些参数在演示中并不会使用, public ...

最新文章

  1. 华为mate8怎么申请云闪付_华为消费者管培生面试问题分享
  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )
  3. postgres外部表
  4. 使用jquery的getJSON从服务器端获得数据
  5. 基于WinDbg的内存泄漏分析
  6. 哪些是MySQL用于放置一些头文件的目录_在古希腊的知识体系中,两大部分是( )。...
  7. Spring-boot快速实现Spring框架配置
  8. Linux内存管理:Fixmaps(固定映射地址)和ioremap
  9. 静态RAM(2K * 8位)6116介绍(抄自原理图)
  10. 性能测试场景设计之用户启停设置
  11. pca主成分分析_PCA主成分分析(中)
  12. Android模拟滑块验证,[Android实例] 拖动滑块进行图片拼合验证方式的实现
  13. 李炎恢php视频教程
  14. 刘强东的敌与友:嘲讽王健林一亿小目标,性侵案后李国庆说该原谅
  15. 上拉电阻的作用原理_单片机P0口以及上拉电阻
  16. 浙大远程教育计算机小抄,一张A4纸能写多少个字?看完浙大考生的“小抄”,网友:稳过!...
  17. php登陆界面点登陆没有反应,ThinkPHP5实战的登录界面的登陆按钮点击之后没有任何反应怎么解决?...
  18. 动态模糊神经网络用于自学习
  19. 【封装】Deviation求方差
  20. NodeJs模块化(KPD)

热门文章

  1. 我们如此努力,也不过是个普通人
  2. java与.net比较学习系列(7) 属性
  3. java类加载的表现形式
  4. linux 执行程序 注销,Linux登录登出的过程 | Soo Smart!
  5. java jlist 更新_java – 更新JList
  6. android监听输入框光标,EditText光标的移动
  7. python中where函数_如何在python中基于Where函数获取两列值
  8. python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构
  9. auuc 评估指标_分类之性能评估指标
  10. Paper5:Curved-Voxel Clustering for Accurate Segmentation of 3D LiDAR Point Clouds with Real-Time Per