定义:

使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂。并且可以保持和被装饰者同一个抽象接口,从而使客户端透明。

结构图:

  • Component:抽象构件类,定义了具体构件和装饰者的共同父类,定义了构件中需要被实现的业务方法。其引入向客户端屏蔽了实现细节,可以统一地处理伪装是之前的具体构件和装饰者类。
  • ConcreteComponent:具体构件类,实现了抽象构件类中定义的业务方法。一般其方法都是比较简单,可以在装饰者中进一步修饰和增加职能。
  • Decorator:抽象装饰者类,持有了一个抽象构件类对象的引用,并且定义了抽象构建类对象的注入方法,同样在实现抽象构建类定义的业务方法时,但只是简单地调用了成员变量的方法。具体职能的增加,放入到子类中。
  • ConcreteDecorator:具体装饰者类,继承了抽象继承类,并重写了其业务方法,在业务方法中加入了新的职能。

透明和半透明模式

在一些情况下装饰类中新添加的功能方法与原有的业务方法相互独立,而且客户端希望可以直接调用,因此就有两种模式。

  • 透明模式:

    装饰模式的标准模式,客户端完全针对抽象层编程,不应该将对象声明为具体构件类或具体装饰类,这两者没有任何区别。并且透明模式允许对象可以被多次装饰使用,来实现更复杂的功能。但透明模式并不能直接访问装饰类新增的功能。
  • 半透明模式:

    半透明模式中,客户端可以不用关心具体的构件,但是需要声明具体的装饰类。半透明模式增加了系统的灵活性,但是不能对对象进行多次修饰,并且需要对两种不同的构件进行区别对待。

装饰者模式与桥接模式的区别

  • 桥接模式包含两个独立变化的维度,并且只在抽象层利用组合建立了桥接关系。
  • 装饰者模式包含的两个维度相互依赖,装饰者所在的维度一般要依赖于具体抽象构件类的维度。并且不仅利用组合建立了连接关系,同时两个维度还同时继承了同一个抽象构建类。

注意:

  • 尽量保持装饰者类与被装饰者类接口一致,从而使客户端可以透明地使用,并利用配置文件等可以灵活地扩展。
  • 尽量保持被装饰者类是一个轻类,不用把太多的行为放在装饰者类中,我们可以通过装饰者类对其进行扩展。
  • 如果只有一个具体构件类,可以直接让装饰者类继承该构建类。如图:

优点:

  • 可以动态地为类添加功能,并且不会导致类的个数急剧增加。
  • 可以对一个对象多次装饰,使用不同的装饰类进行组合可以实现复杂的功能。
  • 具体构件和装饰类可以独立变化,方便扩展,符合开闭原则。

适用场景:

  • 在不影响其它类的情况下,动态、透明地给单个对象增加职责。

实例:

DecoratorPattern.java

七个结构模式之装饰者模式(Decorator Pattern)的更多相关文章

  1. Java进阶篇设计模式之五-----外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  2. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  3. 涉及模式之 装饰器模式详解(与IO不解的情缘)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...

  4. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  5. IOS设计模式之二(门面模式,装饰器模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  6. Java中设计模式之装饰者模式-3

    装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...

  7. 聊聊模板方法模式,装饰器模式以及AOP

    在软件系统设计的时候,我们需要把一个大的系统按照业务功能进行拆分,做到高内聚.低耦合. 但是呢,拆分之后会产生一些通用性的东西,比如日志,安全,事务,性能统计等,这些非功能性需求,横跨多个模块.最lo ...

  8. javascript设计模式----桥接模式、组合模式、装饰者模式、享元模式

    http://blog.csdn.net/painsonline/article/details/7215087    桥接模式:http://www.cnblogs.com/TomXu/archiv ...

  9. java代理模式与装饰者模式

    静态代理和装饰者模式的区别: 先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 总结一下采用装饰者模式是为了增强或拓展原对象的功能. ...

随机推荐

  1. 构造persen

    package java1; //人类 public class Person { //属性 成员变量 String name; int age=30; //方法 函数 成员函数 void hello ...

  2. Java 集合 — HashMap

    HashMap 无序(每次resize的时候都会变) 非线程安全 key和value都看可以为null 使用数组和链表实现 查找元素的时候速度快 几个重要属性: loadFactor:用来计算thre ...

  3. WPF中找不到Image或者Image不是Drawing系列

    WPF中默认没有引用WinForm里面的一些东西,都是用它自带的那一套,但又不能完全脱离,所以有的时候比较蛋疼

  4. springMVC robots.txt 处理

    正常情况这样就好使 <mvc:resources mapping="/robots.txt" location="/lib/robots.txt"/> ...

  5. PHP变量在内存中的存储方式

    原文:http://www.phppan.com/tag/refcount/ 每门计算机语言都需要一些容器来保存变量数据.在一些语言当中,变量都有特定的类型,如字符串,数组,对象等等.比如C和Pasc ...

  6. Microservices Reference Architecture - with Spring Boot, Spring Cloud and Netflix OSS--转

    原文地址:https://www.linkedin.com/pulse/microservices-reference-architecture-spring-boot-cloud-anil-alle ...

  7. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  8. web接口测试之GET与POST请求

    关于HTTP协议,我考虑了一下觉得没必要再花一节内容来介绍,因为网上关于HTTP协议的介绍非常详细.本着以尽量避免介绍一空洞了概念与理论来介绍接口测试,我这里仍然会给出具体实例. 在此之前先简单的介绍 ...

  9. Testing - 测试基础 - 概念

    测试是为了度量和提高被测试软件的质量,对测试软件进行工程设计.实施.维护的的整个生命周期过程. 仅仅发现Bug是测试的初步,而分析出根本原因推动问题的解决,却要有很深的功底. 不同的测试岗位从事不同的 ...

  10. ionic+nodejs开发遇到的跨域和post请求数据问题

    最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...