定义:

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

结构图:

  • 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. 使用Connetion的属性RetainSameConnection

    在SSIS的组件中,很多都会连接到数据库进行操作,Connection有一个属性RetainSameConnection,默认值是False,控制着连接的打开和关闭的时机. 1,如果Connectio ...

  2. CSS图片裁剪Clip

    CSS Clip 裁剪 可以用它来裁剪一张图片噢. 我们来裁剪一下Google图标,把G字给裁剪下来. 注意这个clip得配合绝对定位才能使用,不然不起效果. rect (top, right, bo ...

  3. 使用Source Safe for SQL Server解决数据库版本管理问题

    简介     在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多 ...

  4. JSP网站开发基础总结《四》

    经过前几篇的摸爬滚打,下面我们就开始我们真正的数据库操作了,本篇重点在于如何在网站端编写数据库操作语句,内容不多,就是我们常见的增删改查. 0.数据库对象创建: 在JAVASE基础知识总结时,就为大家 ...

  5. 这10道javascript笔试题你都会么

    1.考察this var length = 10; function fn() { console.log(this.length); } var obj = {   length: 5, metho ...

  6. Android基于mAppWidget实现手绘地图(十三)–如何显示/隐藏任意类型的地图对象

    这个很简单,想要显示或隐藏任意类型的地图对象,首先要对地图对象进行分类.不同类型的地图对象放置到不同的地图图层上,然后控制地图图层的显示/隐藏即可. 实例: Layer sportsLayer = m ...

  7. Nutch源码阅读进程4---parseSegment

    前面依次看了nutch的准备工作inject和generate部分,抓取的fetch部分的代码,趁热打铁,我们下面来一睹parse即页面解析部分的代码,这块代码主要是集中在ParseSegment类里 ...

  8. Android SDK Android NDK Android Studio 官方下载地址

    2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...

  9. 对于 ThreadLocal 的理解和应用

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各 ...

  10. Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程

    初学 Spring MVC , 感觉对于 @ModelAttribute 和 @SessionAttributes 是如何被Spring MVC处理的,这一流程不是很清楚, 经过Google资料,有了 ...