Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee。这两种实体在Decorator模式中是必须的。
Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
为什么使用Decorator
我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机。Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能。
如何使用装饰模式
举Adapter中的打桩示例,在Adapter中有两种类:方形桩 圆形桩,Adapter模式展示如何综合使用这两个类,在Decorator模式中,我们是要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类。
我们先建立一个接口:
public interface Work{public void insert(); }
接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是无所谓。我们以插入方形桩为例:
public class SquarePeg implements Work{public void insert(){System.out.println("方形桩插入");} }
现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木板,这些额外的功能是动态,可能随意增加调整修改,比如,可能又需要在打桩之后钉架子(只是比喻)。
那么我们使用Decorator模式,这里方形桩SquarePeg是decoratee(被刷油漆者),我们需要在decoratee上刷些"油漆",这些油漆就是那些额外的功能。
public class Decorator implements Work{private Work work;//额外增加的功能被打包在这个List中private ArrayList others = new ArrayList();//在构造器中使用组合new方式,引入Work对象;public Decorator(Work work){this.work=work;others.add("挖坑");others.add("钉木板");}public void insert(){newMethod();}//在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定的 public void newMethod(){otherMethod();work.insert();}public void otherMethod(){ListIterator listIterator = others.listIterator();while (listIterator.hasNext()){System.out.println(((String)(listIterator.next())) + " 正在进行");}} }
在上例中,我们把挖坑和钉木板都排在了打桩insert前面,这里只是举例说明额外功能次序可以任意安排。
好了,Decorator模式出来了,我们看如何调用:
Work squarePeg = new SquarePeg(); Work decorator = new Decorator(squarePeg); decorator.insert();
Decorator模式至此完成。
如果你细心,会发现,上面调用类似我们读取文件时的调用:
FileReader fr = new FileReader(filename);BufferedReader br = new BufferedReader(fr);
实际上Java 的I/O API就是使用Decorator实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐。
Jive中的Decorator实现
在论坛系统中,有些特别的字是不能出现在论坛中如"打倒XXX",我们需要过滤这些"反动"的字体。不让他们出现或者高亮度显示。
在IBM Java专栏中专门谈Jive的文章中,有谈及Jive中ForumMessageFilter.java使用了Decorator模式,其实,该程序并没有真正使用Decorator,而是提示说:针对特别论坛可以设计额外增加的过滤功能,那么就可以重组ForumMessageFilter作为Decorator模式了。
所以,我们在分辨是否真正是Decorator模式,以及会真正使用Decorator模式,一定要把握好Decorator模式的定义,以及其中参与的角色(Decoratee 和Decorator)。
系列文章:
Java设计模式(1)工厂模式(Factory模式)
Java设计模式(2)单态模式(Singleton模式)
Java设计模式(3)建造者模式(Builder模式)
Java设计模式(4)原型模式(Prototype模式)
Java设计模式(5)共享模式/享元模式(Flyweight模式)
Java设计模式(6)桥模式(Bridge模式)
Java设计模式(7)装饰模式(Decorator模式)
Java设计模式(8)组合模式(Composite模式)
Java设计模式(9)适配器模式(Adapter模式)
Java设计模式(10)代理模式(Proxy模式)
Java设计模式(11)外观模式(Facade模式)
Java设计模式(12)迭代模式(Iterator模式)
Java设计模式(13)模板模式(Template模式)
Java设计模式(14)责任链模式(Chain of Responsibility模式)
Java设计模式(15)备忘录模式(Memento模式)
Java设计模式(16)中介模式(Mediator模式)
Java设计模式(17)解释器模式(Interpreter模式)
Java设计模式(18)策略模式(Strategy模式)
Java设计模式(19)状态模式(State模式)
Java设计模式(20)观察者模式(Observer模式)
Java设计模式(21)访问模式(Visitor者模式)
Java设计模式(22)命令模式(Command模式)
Java设计模式(7)装饰模式(Decorator模式)相关推荐
- java设计模式之装饰模式_Java中的装饰器设计模式
java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 适配接口 java_【Java 设计模式】接口型模式--Adapter(适配器)模式
简介:[Java设计模式]接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求. 或者说,现在有classA的方法满足客户 ...
- java设计模式2-观察者模式
java设计模式2-观察者模式 什么是观察者模式? 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新. 在这里,发生改变 ...
- Java设计模式之中介者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之享元模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- java设计模式3种工厂模式
java设计模式3种工厂模式 2010-01-08 16:06:36| 分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...
- Java 设计模式 Adapter 对象适配器 模式
Java 设计模式 Adapter 对象适配器 模式 Adapter模式用于现有的程序无法直接使用,需要做适当的变换之后才能使用的情况. 涉及到的角色 Target对象:定义所需的方法. Client ...
最新文章
- HDU 4540 威威猫系列故事――打地鼠(DP)
- 对XMLHttpRequest异步请求的面向对象封装
- 图解python_图解Python深拷贝和浅拷贝
- SharePoint 2013技巧分享系列 - 同步Exchange显示高清用户照片
- IntelliJ IDEA使用教程(很全)
- 云原生实时数仓首次在2020双11核心数据场景落地
- mysql56 配置内存_【mysql】mysql 内存配置调优
- tag untag_交换机该怎么理解Hybird中Tag和Untag端口模式?
- 鹏芯U盘(UDK2008)意外断电后修复 1
- Java pta题库
- 第九届蓝桥杯C++A组
- 地理和遥感数据获取方法
- 电脑qq如何发送html消息,电脑QQ如何设置按Enter键发送消息
- 程序员常用网站和工具(持续更新)
- 地形建模(二)--TIN拉伸成模型并贴纹理
- C语言练习题之标准电话号码(MOOC)
- U盘在自己电脑读不出来,但其它电脑的可以读,别的u盘在自己电脑又可以识别的解决方法
- ABBYY FineReader如何创建用户语言
- Java中定义抽象类Shape,其中包含抽象方法double getPeremeter( )求周长和double getArea( )求面积。 定义一个矩形类,继承此抽象类,并自行扩充成员变量和方法。
- Linux磁盘/硬盘测速,dd命令,测试顺序读写,测试4K性能