动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式想必生成子类更为灵活。装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰模式中的角色有:1. 抽象构件角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象。2. 具体构件角色(ConcreteComponent):定义一个将要接收附加责任的类。3. 装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。4. 具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任。举个简单例子(类比《Head Fisrt》中的星巴克:吃杂粮煎饼,加个鸡蛋,加根火腿,加份辣条)
1 抽象构件角色import java.math.BigDecimal;public abstract class Pancake {protected String name;public String getName() {return this.name;}public abstract BigDecimal getPrice();}
2 具体构件角色public class CoarsePancake extends Pancake {public CoarsePancake() {this.name = "杂粮煎饼";}@Overridepublic BigDecimal getPrice() {return new BigDecimal(5);}}
3 装饰角色public abstract class Condiment extends Pancake {public abstract String getName();public void sold() {System.out.println(getName() + ": " + getPrice());}}
4 具体装饰角色public class Egg extends Condiment {private Pancake pancake;public Egg(Pancake pancake) {this.pancake = pancake;}@Overridepublic String getName() {return pancake.getName() + ", 加鸡蛋";}@Overridepublic BigDecimal getPrice() {return pancake.getPrice().add(new BigDecimal(1.5));}}public class Ham extends Condiment {private Pancake pancake;public Ham(Pancake pancake) {this.pancake = pancake;}@Overridepublic String getName() {return this.pancake.getName() + ", 加火腿";}@Overridepublic BigDecimal getPrice() {return pancake.getPrice().add(new BigDecimal(2));}}public class Lettuce extends Condiment {private Pancake pancake;public Lettuce(Pancake pancake) {this.pancake = pancake;}@Overridepublic String getName() {return this.pancake.getName() + ", 加生菜";}@Overridepublic BigDecimal getPrice() {return pancake.getPrice().add(new BigDecimal(1));}}
5 测试代码public class MainTest {public static void main(String[] args) {Pancake pancake = new CoarsePancake();Condiment egg = new Egg(pancake);Condiment ham = new Ham(egg);ham.sold();Condiment lettuce = new Lettuce(ham);lettuce.sold();}}
测试结果:杂粮煎饼, 加鸡蛋, 加火腿: 8.5
杂粮煎饼, 加鸡蛋, 加火腿, 加生菜: 9.5
适用场景1. 想透明并且动态地给对象增加新的职责的时候2. 给对象增加的职责,在未来存在增加或减少功能3. 用继承扩展功能不太现实的情况下,应该考虑用组合的方式
优点:1. 通过组合而非继承的方式,实现了动态扩展对象的功能的能力。2. 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。3. 充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点。4. 装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的。5. 遵守大部分GRAP原则和常用设计原则,高内聚、低偶合。
缺点:1. 装饰链不能过长,否则会影响效率。2. 因为所有对象都是继承于Component,所以如果Component内部结构发生改变,则不可避免地影响所有子类(装饰者和被装饰者),3. 只在必要的时候使用装饰者模式,否则会提高程序的复杂性,增加系统维护难度。
Jdk中的装饰模式:由于Java I/O库需要很多性能的各种组合,如果这些性能都是用继承的方法实现的,那么每一种组合都需要一个类,这样就会造成大量性能重复的类出现。而如果采用装饰模式,那么类的数目就会大大减少,性能的重复也可以减至最少。因此装饰模式是Java I/O库的基本模式。

根据上图可以看出:1. 抽象构件(Component)角色:由InputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。2. 具体构件(ConcreteComponent)角色:由ByteArrayInputStream、FileInputStream、PipedInputStream、StringBufferInputStream等类扮演。它们实现了抽象构件角色所规定的接口。3. 抽象装饰(Decorator)角色:由FilterInputStream扮演。它实现了InputStream所规定的接口。4. 具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是BufferedInputStream、DataInputStream以及两个不常用到的类LineNumberInputStream、PushbackInputStream。

设计模式:装饰模式(Decorator)相关推荐

  1. 设计模式-装饰模式(Decorator Pattern)

    Attach additional responsibilities to an object dynamically keeping the same interface.Decorators pr ...

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

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

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

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

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

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

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

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

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

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

  7. 装饰模式(Decorator)简介

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

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

    装饰者模式,我刚看到这个模式的时候,我的脑海里第一反应是已经很经典的广告语:人靠衣装,美靠亮装.思想上移 一点就是装饰模式,就是对某个东西进行装饰,对某个功能进行附加,从而得到新的功能. 现在我们来学 ...

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

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

  10. 装饰者设计模式(Decorator)

    装饰者设计模式(Decorator) 装饰者设计模式你也可以称之为装饰器设计模式,反正你想叫啥叫啥,我这里习惯叫装饰者了. 有同学估计已经学的累了,心想,这个sb博主,怎么唠唠叨叨的还没写完呢,大家稍 ...

最新文章

  1. 2018-3-6论文-网络评论中非结构化信息的应用于研究------(语义矩离)
  2. CSDN 居然免费送会员?程序员们快来领!
  3. Eclipse快捷键归纳及整理
  4. python—多线程定义和创建(一)
  5. boost::histogram::detail::make_default用法的测试程序
  6. DockerCompose-部署微服务集群
  7. 深度学习文本分类在支付宝投诉文本模型上的应用
  8. 电脑键盘练习_用键盘打字怎样才能练得快,有什么窍门没?
  9. leetcode - 543. 二叉树的直径
  10. powershell 安装mvn_Maven 安装好之后,命令行执行 `mvn -v` 提示“'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文件。”...
  11. python socketserver连接数量限制_python中socketserver的一个疑问
  12. nginx学习笔记之安装
  13. 如何编写游戏辅助工具
  14. 2021最新一线互联网大厂常见高并发面试题解析,快手Java面试算法题
  15. python 读取文件夹下文件,将文件名作为制作标签,训练样本
  16. vb6.0企业版id_国网公司十八项反措(2018版)开关设备专题解读
  17. 关于LTE网络质量的参数
  18. putty永久设置session
  19. 泰山OFFICE技术讲座:介绍几个看着相似的标点
  20. springboot自定义ClassLoader实现同一个jar支持多版本的使用场景【附源码】

热门文章

  1. Visual C# 2008+SQL Server 2005 数据库与网络开发--13.1.3 简单记事本程序菜单设计
  2. (七)webStorage使用实例——webStorage作为简易数据库来使用
  3. 【学习笔记】第五章 python3核心技术与实践--字典和集合
  4. IDC:全球经济危机为云计算带来曙光
  5. 【项目管理】老板与客户意见冲突怎么办?
  6. Raspberry PI 系列 —— 裸机点亮LED灯
  7. 已知图片大小,让其在页面中垂直水平居中
  8. Asp.Net MVC 使用FileResult导出Excel数据文件
  9. 汽车之家购买价格PC真正的原因阿拉丁
  10. Windows Mobile 5