作者 | 小灰

来源 | 程序员小灰(ID:chengxuyuanxiaohui)

—————  第二天  —————

————————————

装饰器模式都包含哪些核心角色呢?

1. Component接口

在我们上面的例子中,Component接口相当于汽车接口,所有的被包装类、包装类,都继承于这个接口。

2. ConcreteComponent类

ConcreteComponent类是被包装的实现类。在例子中,奔驰汽车、宝马汽车、特斯拉汽车都属于这个角色。

3. Decorator抽象类

所有的包装类,都继承自Decorator抽象类,而Decorator类又实现了Component接口,这么做是为了实现多层嵌套包装。

4. ConcreteDecorator类

具体的包装类,用于扩充被包装类的功能,比如例子中的自动驾驶功能、飞行功能扩展。

这四大核心角色的关系是怎样的呢?我们可以用装饰器模式的UML类图来表达:

首先是汽车接口,也就是Component这个角色,里面定义了run这个行为:

public interface Car {    void run();}

接下来是各种汽车的实现类,也就是ConcreteComponent角色,不同的汽车对于run行为有着不同的实现:

public class BenzCar implements Car{    @Override    public void run() {        System.out.println("奔驰开车了!");    }}
public class BmwCar implements Car{    @Override    public void run() {        System.out.println("宝马开车了!");    }}
public class TeslaCar implements Car{    @Override    public void run() {        System.out.println("特斯拉开车了!");    }}

下面是装饰器的抽象类,也就是Decorator角色,这个角色包含了被装饰的成员对象:

public class CarDecorator implements Car {protected Car decoratedCar;public CarDecorator(Car decoratedCar){        this.decoratedCar = decoratedCar;    }public void run(){        decoratedCar.run();    }}

或许有人会觉得奇怪,为什么装饰器类也要实现Car接口呢?这正是装饰器模式的灵活之处。

继承自Car接口,可以让每一个装饰器本身也可以被更外层的装饰器所包装,包装的方式就是把Car对象作为参数,传入到外层装饰器的构造函数当中。

接下来是具体的装饰器实现类,也就是ConcreteDecorator角色。这些装饰器同样实现了run的行为,一方面会调用被包装对象的run方法,一方面会进行某些扩展操作(比如自动驾驶、飞行):

public class AutoCarDecorator extends CarDecorator {public AutoCarDecorator(Car decoratedCar){super(decoratedCar);}@Overridepublic void run(){decoratedCar.run();autoRun();}private void autoRun(){System.out.println("开启自动驾驶");}}public class FlyCarDecorator extends CarDecorator {public FlyCarDecorator(Car decoratedCar){super(decoratedCar);}@Overridepublic void run(){decoratedCar.run();fly();}private void fly(){System.out.println("开启飞行汽车模式");}}

最后,是我们的客户端类。客户端类负责创建被包装对象和装饰者,并决定如何进行包装和执行:

public class Client {public static void main(String[] args) {Car benzCar = new BenzCar();Car bmwCar = new BmwCar();Car teslaCar = new TeslaCar();//创建自动驾驶的奔驰汽车CarDecorator autoBenzCar = new AutoCarDecorator(benzCar);//创建飞行的、自动驾驶的宝马汽车CarDecorator flyAutoBmwCar = new FlyCarDecorator(new AutoCarDecorator(bmwCar));benzCar.run();bmwCar.run();teslaCar.run();autoBenzCar.run();flyAutoBmwCar.run();}
}

以输入流为例,为了满足不同输入场景,JDK设计了多种多样的输入流,包括ByteArrayInputStream、FileInputStream等等。

这些输入流都继承自共同的抽象类:InputStream。

与此同时,为了给这些输入流带来功能上的扩展,JDK设计了一个装饰器类,FilterInputStream。该类继承自InputStream,并且“组合”了InputStream成员对象。

从FilterInputStream类派生出了许多装饰器子类,包括BufferedInputStream,DataInputStream等等,分别提供了输入流缓冲,以及从输入流读取Java基本数据类型等额外功能。

更多精彩推荐
☞拼多多回应开除程序员:严重违反员工行为规范,因此解约!
☞太委屈!曾一举击败英伟达,却因坚持研发背负骂名的国际 IT 大佬
☞拼多多回应员工言论被识别;GitHub 程序员考公指南冲上热榜;Flash Player 中国版将继续更新  | 极客头条☞再见 VBA!神器工具统一 Excel 和 Python
☞创业公司用 Serverless,到底香不香?
☞“秤”心不如务“时”,Libra合规路暗藏玄机

点分享

点收藏

点点赞

点在看

漫画设计模式:什么是 “装饰器模式” ?相关推荐

  1. 设计模式之【装饰器模式】

    和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...

  2. 设计模式篇——初探装饰器模式

    文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程 ...

  3. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  4. java中装饰器_Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  5. 《设计模式》之装饰器模式

    一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...

  6. Java设计模式之《装饰器模式》及应用场景

    一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式 ...

  7. Java设计模式之《装饰器模式》

    一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式 ...

  8. 【Java设计模式系列】装饰器模式(Decorator Pattern)

    简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...

  9. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  10. 装饰者模式 php,PHP设计模式之装饰器模式

    装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...

最新文章

  1. linux做预警机制,预警通告:Linux内核中TCP SACK机制远程DoS
  2. RavenDB FS 安装使用 介绍
  3. 解决ajax的status=0问题
  4. Design Pattern - Proxy(C#)
  5. 解密回声消除技术之一(理论篇)
  6. [BZOJ] 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
  7. 木糖醇、可口可乐零度:可怕的传闻
  8. 微信小程序 没有找到 node_modules 目录
  9. Python time 模块 - Python零基础入门教程
  10. ASP.NET MVC中使用Autofac实现简单依赖注入
  11. 红橙Darren视频笔记 网络请求优化方案 OOP面向对象 6大基本原则
  12. OpenCV学习笔记:基础结构
  13. invalid use of incomplete type 报
  14. 来来,一起设计一个简单的活动发布系统
  15. mysql8.0升级_MySql版本升级(8.0.19升级到8.0.22)
  16. 图像增广——图片旋转任意角度(python实现)
  17. java 面试 英语自我介绍
  18. 新零售 —— 智慧门店原理详解
  19. pcf8591c语言编程,PCF8591应用程序
  20. 如何查找一篇英文文章中出现频率最高的单词?

热门文章

  1. 彻底炸锅了!华为新天才少年出炉:武大94年博士生入选!任正非最新发声:江山代有才人出,不拘一格降人才!...
  2. SAP零售行业解决方案初阶 3 - WB01 创建Site Master
  3. 药企信息化项目必经的三步走
  4. 事关人类生存?为什么要探寻AI系统的可解释性?
  5. 谷歌推出新模型「pQRNN」,少量参数下进行文本分类,性能堪比BERT
  6. SAP BD87将IDoc状态修改为68 ?
  7. 公平与精确同样重要!CMU提出学习公平表征方法,实现算法公平
  8. 微软分享史上最大基于Transformer架构的语言生成模型
  9. 保守的机器学习如何拯救日新月异的我们
  10. 为什么医学影像AI已进入「后深度学习时代」?