1、意图

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活

2、适用性

以下情况使用Decorator模式

(1)在不影响期货对象的情况下,以动态、透明的方式给单个对象添加职责

(2)处理那些可以撤消的职责

(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况 可能是因为类定义被隐藏,或类定义不能用于生成子类。

3、参与者

(1)Component:定义一个对象接口,可以给这些对象动态地添加职责

(2)ConcreteComponent:定义一个对象,可以给这个对象添加一些职责

(3)Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

(4)ConcreteDecorator:向组件添加职责

4、协作

Decorator钭请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

5、效果

Decorator模式至少有两个主要优点和两个缺点:

(1)比静态继承更灵活:与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。相比之下,继承机制要求为每个添加的职责创建一个新的子类。这会产生许多新的类,并且会增加系统的复杂度。此外,为一个特定的Component类提供多个不同的Decorator类,这就使得你可以对一些职责进行混合和匹配。

(2)避免在层次结构高层的类有太多的特征:Decorator模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用Decorator类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。这样,就用程序不必为不需要的特征付出代价。同时也更易于不依赖于Decorator所扩展的类而独立地定义新类型的Decorator。扩展一个复杂类的时候,很可能会暴露与添加的职责无关的细节。

(3)Decorator与它的Component不一样: Decorator就一个透明的包装。如果我们从对象标识的观点出发,一个被装饰的了 组件与这个组件是有差别的。因此,使用装饰时不应该依赖对象标识。

(4)有许多小对象:采用Decorator械进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式 上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于那些了解这些系统的人来说,很容易以它们进行定制,但是很难学习这些系统,排错也很困难。

6、相关模式

Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口,而适配器将给对象一个全新的接口

Composite模式可以将装饰视为一个退化的、仅有一上组件的组合。然而,装饰仅给对象添加一额外的职责

Strategy模式:用一个装饰你可能改变对象的外表,而Strategy模式使得你可以改变对象的内核。这个改变对象的两种途径。

结构型模式之Decorator模式相关推荐

  1. Java设计模式之结构型:装饰器模式

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

  2. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  3. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  4. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  5. 也说说“从Adapter模式到Decorator模式”

    为什么80%的码农都做不了架构师?>>>    终于有时间写点什么了,可以前酝酿好的东西似乎一下子都忘记了.这几天看了wayfarer的<<让僵冷的翅膀飞起来>系列 ...

  6. 创建型、结构型、行为型模式(2)

    来源:http://blog.csdn.net/wulingmin21/article/details/6757111 创建型模式 Singleton模式解决的是实体对象个数的问题. 除了Single ...

  7. 创建型、结构型、行为型模式(1)

    来源:http://blog.csdn.net/wulingmin21/article/details/6753363 目的 创建型模式 Creational Pattern 结构型模式 Struct ...

  8. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  9. 设计模式——结构型之用桥梁模式(Bridge Pattern)将“抽象”与“实现”解耦(五)

    引言 相信对于现实生活中这样的情况都不陌生,比如说开关与它具体控制的电器,开关的类型多种多样,而电器也是千变万化,两者之间相对独立变化却又耦合在一起,再比如说奶茶店的奶茶,有不同规格大小.不同口味.不 ...

最新文章

  1. conda环境里安装pydot
  2. “光名字就想了一年”,苹果三位高管谈M1芯片
  3. perl基本语法--转载
  4. Spring Boot @ConfigurationProperties注解的使用
  5. 请简述php循环控制语句,PHP 循环控制语句几种方法详解_PHP教程
  6. nginx源码分析configure脚本详解
  7. java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
  8. Maven,在pom.xml配置JDK 9版本。
  9. Dijkstrala算法
  10. /etc/fstab 文件配置项简单介绍
  11. 操作系统——实验叁——主存空间的分配与回收
  12. 网页文字无法复制解决方法
  13. oracle 安装时的日志文件,oracle10g安装的日志文件 Oracle10g怎么查看操作日志
  14. Spark RDD Transformation
  15. ora01031权限不足linux,ORA-01031:权限不足
  16. python 方差齐性检验_SPSS正态分布以及方差齐性检验以及Wilcox检验
  17. MATLAB与Excel文件的交换
  18. JS(javascript)在自动化测试项目中的应用【软件测试开发入门教程】
  19. Mac上解压Rar,Zip,7z等格式的解压软件,推荐这一款免费软件就够了,堪比Win11上的winrar
  20. 数据库设计----概念结构设计(概念模型、E—R模型、概念结构设计)

热门文章

  1. rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)
  2. Android模拟器访问pc与网络的问题
  3. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-基于接口驱动的数据层...
  4. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...
  5. ipython安装教程-ipython notebook教程
  6. python安装教程windows-Python for windows 安装教程
  7. python小程序-Python基本小程序
  8. python爬虫完整实例-Python爬虫 实例
  9. python pandas读取excel-python pandas模块简单使用(读取excel为例)
  10. python在日常工作处理中的应用-python在工作中的应用场景介绍