声明:转载请附上原文链接

提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之——桥接模式和组合模式 序号从7开始。

8. 装饰器设计模式(重点)

8.1 装饰器设计模式简介

  • 装饰器设计模式(Decorator Pattern)

    • 也叫包装设计模式,属于结构型模式,它是作为现有的 类的⼀个包装,允许向⼀个现有的对象添加新的功能, 同时⼜不改变其结构
    • 给对象增加功能,⼀般两种⽅式 继承或关联组合,将⼀ 个类的对象嵌⼊另⼀个对象中,由另⼀个对象来决定是 否调⽤嵌⼊对象的⾏为来增强功能,这个就是装饰器模 式,⽐继承模式更加灵活
  • 应⽤场景
    • 以动态、透明的⽅式给单个对象添加职责,但⼜能不改 变其结构
    • JDK源码⾥⾯应⽤的最多的就是IO流,⼤量使⽤装饰设 计模式

  • ⻆⾊(装饰者和被装饰者有相同的超类(Component))

    • 抽象组件(Component)

      • 定义装饰⽅法的规范,比如,最初的⾃⾏⻋,仅仅定义了 ⾃⾏⻋的API;
    • 被装饰者(ConcreteComponent)
      • Component的具体实现,也就是我们要装饰的具体 对象
      • 实现了核⼼⻆⾊的具体⾃⾏⻋
    • 装饰者组件(Decorator)
      • 定义具体装饰者的⾏为规范, 和Component⻆⾊有 相同的接⼝,持有组件(Component)对象的实例引⽤
      • ⾃⾏⻋组件都有名称和价格
    • 具体装饰物(ConcreteDecorator)
      • 负责给构件对象装饰附加的功能
      • ⽐如给自行车加喇叭,或者加防爆胎

8.2 案例

抽象组件(Component)——自行车抽象接口

/*** @Auther: csp1999* @Date: 2020/11/15/12:43* @Description: 自行车抽象接口(抽象组件component)*/
public interface Bike {/*** 自行车相关的描述* @return*/String getDescription();/*** 自行车价格* @return*/int getPrice();
}

被装饰者(ConcreteComponent)——大/小号自行车

/*** @Auther: csp1999* @Date: 2020/11/15/12:45* @Description: 大号自行车(具体的被装饰者ConcreteComponent)*/
public class BigBike implements Bike{private String description = "大号自行车";@Overridepublic String getDescription() {return description;}/*** 200元是大号自行车的价格* @return*/@Overridepublic int getPrice() {return 200;}
}
----------------------------------------------------------------------
/*** @Auther: csp1999* @Date: 2020/11/15/12:45* @Description: 小号自行车(具体的被装饰者ConcreteComponent)*/
public class SmallBike implements Bike{private String description = "小号自行车";@Overridepublic String getDescription() {return description;}/*** 100元是小号自行车的价格* @return*/@Overridepublic int getPrice() {return 100;}
}

装饰者组件(Decorator)

/*** @Auther: csp1999* @Date: 2020/11/15/12:50* @Description: 装饰者组件Decorator*/
public class BikeDecorator implements Bike{private String description = "我只是装饰器,什么都不表示,子类帮我传递...";@Overridepublic String getDescription() {return description;}@Overridepublic int getPrice() {return 0;}
}

具体装饰物(ConcreteDecorator)——防爆胎/喇叭

/*** @Auther: csp1999* @Date: 2020/11/15/12:53* @Description: 防爆胎(具体装饰ConcreteDecorator)*/
public class RSCBikeDecorator extends BikeDecorator {// 重写父类方法private String description = "为自行车增加一个防爆胎...";private Bike bike;public RSCBikeDecorator(Bike bike) {this.bike = bike;}@Overridepublic String getDescription() {return bike.getDescription() + description;}/*** 50是防爆胎的价格* @return*/@Overridepublic int getPrice() {return bike.getPrice() + 50;}
}
-----------------------------------------------------------------------
/*** @Auther: csp1999* @Date: 2020/11/15/12:53* @Description: 喇叭(具体装饰ConcreteDecorator)*/
public class SuonaBikeDecorator extends BikeDecorator {// 重写父类方法private String description = "为自行车增加一个喇叭...";private Bike bike;public SuonaBikeDecorator(Bike bike) {this.bike = bike;}@Overridepublic String getDescription() {return bike.getDescription() + description;}/*** 30是喇叭的价格* @return*/@Overridepublic int getPrice() {return bike.getPrice() + 30;}
}

测试

@Test
public void testDecorator() {/*** 大自行车200/小自行车100* 防爆胎1 50* 防爆胎2 50* 喇叭 30*/// 选一个自行车Bike bike = new BigBike();// 给自行车装2个RSC防爆胎bike = new RSCBikeDecorator(bike);bike = new RSCBikeDecorator(bike);// 给自行车再装1个喇叭bike = new SuonaBikeDecorator(bike);System.out.println(bike.getDescription()+" 价格: " + bike.getPrice());
}

测试结果:

大号自行车为自行车增加一个防爆胎...为自行车增加一个防爆胎...为自行车增加一个喇叭... 价格: 330

8.3 总结

  • 装饰器设计模式优点

    • 装饰模式与继承关系的⽬的都是要扩展对象的功能,但 装饰模式可以提供⽐继承更多的灵活性。
    • 使⽤不同的具体装饰类以及这些装饰类的排列组合,可 以创造出很多不同⾏为的组合,原有代码⽆须改变,符 合“开闭原则”
  • 装饰器设计模式缺点
    • 装饰模式增加了许多⼦类,如果过度使⽤会使程序变得 很复杂 (多层包装)
    • 增加系统的复杂度,加⼤学习与理解的难度

8.4 扩展:Stream IO流 中的装饰器设计模式

  • 抽象组件(Component):InputStream

    • 定义装饰⽅法的规范
  • 被装饰者(ConcreteComponent) : FileInputStream 、 ByteArrayInputStream
    • Component的具体实现,也就是我们要装饰的具体对 象
  • 装饰者组件(Decorator):FilterInputStream
    • 定义具体装饰者的⾏为规范, 和Component⻆⾊有相同 的接⼝,持有组件(Component)对象的实例引⽤
    • ⾃⾏⻋组件 都有 名称和价格
  • 具体装饰物 (ConcreteDecorator):BufferedInputStream、 DataInputStream
    • 负责给构件对象装饰附加的功能
    • ⽐如 喇叭,防爆胎

  • 应⽤场景
//添加了Buffer缓冲功能
InputStream inputStream = new
BufferedInputStream(new FileInputStream(""));

如果文章对您有帮助希望点赞或者关注支持一下!

初学Java常用设计模式之——装饰器模式相关推荐

  1. Java常用设计模式之装饰者模式

    在我们进行Java开发的时候,很多时候我们可能对Java提供给我们的对象不满意,不能满足我们的功能.此时我们就想对Java原对象进行增强,能够实现我们想要的功能就好. 一般来说,实现对象增强有三种方式 ...

  2. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

  3. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  4. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  5. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  6. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  7. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  8. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  9. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

最新文章

  1. 算法学习:manacher
  2. vue中什么样的数据可以是在视图中显示
  3. servlrt程序的入口点是_刚刚,微信偷偷更新,小程序又放大招了!
  4. python你是否也走进了这个误区了_Python是不是被严重高估了?
  5. Mysql存储过程查询结果赋值到变量
  6. Java DOM方式解析XML(模板)
  7. 大数据Hadoop之——数据同步工具DataX
  8. 百度移动搜索优化指南2.0
  9. vue接入百度翻译api
  10. 【游戏安利】 益智休闲类游戏安利
  11. javascript案例26——求100以内所有7倍数之和
  12. rec卡刷root吗,卡刷需要root权限吗
  13. 阿里云ECS服务器概念理解
  14. OSI七层协议和Tcp/IP五层协议,路由器交换机和HUB的区别
  15. go中生成可执行文件
  16. skycc供求信息发布软件 V8.5正式版
  17. 支持html邮件,HTML邮件兼容问题与解决方案
  18. 与其这样挥霍时间,倒不如折腾折腾,尝试发展副业
  19. 用python实现解常微分方程组的简单示例以及用odeint解常微分方程的范例
  20. GIS文件转化为GMT文件的步骤

热门文章

  1. 天行健,君子以自强不息!
  2. 1998-2014年工企污染数据库
  3. Eclipse插件AngularJS Eclipse 1.2.0离线安装包
  4. OpenCV 中getTickCount()计时
  5. 燕山大学——软件用户界面设计(八)原型设计
  6. 数据库系统概论第五版课后习题
  7. linux 中yum 安装maven
  8. Matlab:索引超出数组范围
  9. Tomcat的下载、安装和使用(超详细讲解)
  10. 教你如何使用 Visual Studio IDE 正确的进行 C++ 桌面开发