装饰者模式

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。

UML图

装饰者包含四个基本类

  • 抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。

  • 具体构件角色(Concrete Component):定义将要接收附加责任的类。

  • 装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口。

  • 具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。

举个栗子
装饰者模式跟玩芭比娃娃有点像
Component就像是芭比娃娃玩具(外面的包装)
ConcreteComponent就好比刚刚从包装里面拿出来的芭比娃娃
Decorator就好比放芭比衣服和装饰的盒子
下面具体的实现就是芭比的衣服、头发之类的装饰。
然后就拿起芭比娃娃给她穿衣服、带头发就好了

//整套芭比娃娃玩具
interface Component{void toDo();
}
//芭比娃娃实体
class ConcreteComponent implements Component{@Overridepublic void toDo() {System.out.println("我是芭比娃娃");}}
//装饰箱
class Decorator implements Component{private Component component;public Decorator(Component component){this.component=component;}@Overridepublic void toDo() {component.toDo();}}
//芭比的衣服
class Clothes extends Decorator{public Clothes (Component component) {super(component);}@Overridepublic void toDo() {super.toDo();System.out.println("穿上衣服");}
}
//芭比的鞋子
class Shoe extends Decorator{public Shoe (Component component) {super(component);}@Overridepublic void toDo() {super.toDo();System.out.println("穿鞋子");}
}
public class Client {public static void main(String[] args){Component cct=new ConcreteComponent();cct=new Shoe (new Clothes (cct));cct.toDo();}
}
/*输出
我是芭比娃娃
穿上衣服
穿鞋子
*/

显而易见的是被装饰类在编译的只有主要的一些功能,而在运行的时候却可以动态的给它加上其他的功能职责,而且继续增加其他的职责也不需要改动原类,只需要继续增加装饰类即可,完美实现了开闭原则。还有一个优点是这种动态增加比继承要灵活许多。

有意思的是当我看到这句代码的时候

cct=new Shoe (new Clothes (cct));

我突然发现跟我们的IO流太像了,经过查找资料发现,io正是运用了装饰者模式的一个典型例子,上图

设计思想学习—装饰者模式相关推荐

  1. C++课程--设计设计思想、方法与模式(李建忠老师)

    [干货回顾]李建忠老师在 Boolan 直播间和大家畅聊<C++ 软件设计与模式的道法术>,精辟囊括了<软件设计思想.方法与模式>C++课程的主要内容,以下为本期直播干货重点: ...

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

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

  3. Kafka/Metaq设计思想学习笔记 转

    转载自: http://my.oschina.net/geecoodeer/blog/194829 本文没有特意区分它们之间的区别,仅仅是列出其中笔者认为好的设计思想,供后续设计参考.  目前笔者并没 ...

  4. 九大常用设计模式学习-装饰者模式

    设计模式学习记录:一句话+代码体会设计模式. 九大常用设计模式 单例模式:https://blog.csdn.net/qq_37902949/article/details/87903569 简单工厂 ...

  5. 从网吧上网中学习装饰者模式

    前言 前面在学习mybatis缓存那些事中,我们提到CachingExecutor,以及cache接口中用到了装饰者设计模式,那么到底什么是装饰者设计模式呢?它有什么优势呢?下面结合网吧上网的例子来看 ...

  6. 从LOL金克斯的不解释连招学习装饰者模式

    装饰者模式 贴一个百度都是复制粘贴的定义: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.就增加功能来说,Decorator模式比生成子 ...

  7. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  8. 设计模式之装饰者模式(五)

    设计模式之装饰者模式(五) 前几天把创建型设计模式学习了一下,因为之前了解过,算是复习吧. 接下来进行结构型设计模式,结构型设计模式包括:适配器,桥接,外观,组合,装饰者,享元,代理 今天来学习装饰者 ...

  9. python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式

    漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变. 我以前也看过很 ...

最新文章

  1. webBrowser自动填充、抓取网页数据
  2. ubuntu导入第三方库_ubuntu用户切换、配置Python开发环境与所需的第三方库
  3. 前端将二进制数据流转为文件_前端通过二进制流下载文件
  4. Spring Boot Actuator [监控与管理]
  5. SQL 递归树 子父节点相互查询
  6. python3数据库框架_Python3 MySQL 数据库连接:安装pymysql(mysql数据库驱动), sqlalchemy(ORM框架)。...
  7. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property...
  8. 华为各系列交换机限速配置
  9. 资深影迷不可不知的宽高比:Aspect Ratio 电影画面比例
  10. vnc远程控制软件配置,vnc远程控制软件怎么配置的,教程详解
  11. ES性能优化原理揭秘!初看一脸懵逼,看懂直接跪下。。。
  12. TP5 控制器命名大小写问题
  13. 婚纱预订小程序开发,商家线上展示平台
  14. java ppt 绘图,PPT图片别再直接插入,这样处理一下,让你的PPT秒变高逼格
  15. 用双向宽搜来提高搜索效率
  16. Request 。。。。。 Response
  17. Python: pathlib基础用法
  18. Java 线程池 8 种拒绝策略
  19. three.js基础几何体:立方体,球,圆柱的绘制
  20. Spring全家桶系列–[SpringBoot入门到跑路]

热门文章

  1. 「保姆级教学」Mac下JDK环境配置
  2. sqli-labs-Basic
  3. php 目录斜杠 不同服务器,PHP_PHP在引号前面添加反斜杠(PHP去除反斜杠),一般空间商提供的服务器空间 - phpStudy...
  4. QThread之moveToThread用法
  5. Redis的基本数据类型
  6. Win10 PE出现无法创建新的分区也找不到现有的分区解决方案
  7. 利用IPV6配置家用公网服务器
  8. 各省市经济情况分析——基于SAS软件
  9. JavaScript模块化-CommonJS规范
  10. 熟练java语言-基础掌握