装饰模式Decorator

定义

为对象动态的增加新的功能,实现要求装饰对象和被装饰对象实现同一接口或抽象类,装饰对象持有被装饰对象的实例。

java实现要点

  1. 定义一个接口或抽象类,作为被装饰者的抽象
  2. 对1定义的抽象,进行具体的实现,作为装饰者,装饰者的构造函数传入1的实例,并持有。
  3. 装饰者对持有的被装饰者进行装饰

代码示例


//定义共同的接口
public interface Resizable {
public void resize();
}
//被装饰者为接口的任意实现
public class Source implements Resizable {
@Override
public void resize() {
System.out.println("the original method!");
}
}
//装饰者对接口的任意实现进行装饰
public class Decorator implements Resizable {
private Resizable source;
public Decorator(Resizable source){ //构造器注入被装饰对象
super();
this.source = source;
}
@Override
public void method() { //实现接口方法,并对被装饰者进行装饰
System.out.println("before decorator!");
source.resize();
System.out.println("after decorator!");
}
}

JDK中的装饰模式

java.io包中流的设计,是装饰模式的经典之作。具体为(以输入流为例):

  1. 定义抽象父类InputStream
  2. 然后对InputStream进行具体实现:ByteArrayInputStream、FileInputStream、ObjectInputStream等
  3. 其中FilterInputStream的又有其子类,分别是:BufferedInputStream、DataInputStream等,FilterInputStream什么也没做,仅仅是调用抽象父类InputStream的方法(委托)。
  4. 最终各具体实现类,实现装饰一个InputStream,为它添加它原本不具有的功能。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/home/user/abc.txt")));
//对任意InputStream实现类的装饰
InputStream in=new BufferedInputStream(new DataInputStream(new ObjectInputStream(new FileInputStream("d:hello.txt"))));

装饰模式/decorator模式/结构型模式的更多相关文章

  1. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  2. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  3. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  4. 设计模式学习之路——Facade 外观模式(结构型模式)

    动机: 组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系 ...

  5. 设计模式(八):Bridge桥接模式 -- 结构型模式

    1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...

  6. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  7. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  8. 设计模式学习之装饰者模式(Decorator,结构型模式)(16)

    参考地址:http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一.定义:装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相 ...

  9. Decorator装饰者模式(结构型模式)

    1.需求 假设让我们去设计FCL中的Stream类,该类具有流类的基本功能,除了有各种不同类型的流外(如内存流.文件流.网络流等等),但是在不同的业务场景下,如处理银行业务,需要给相关的内存流进行加密 ...

随机推荐

  1. [20160731]read a file and print it on the screen

    //read a file and print it on the screen import java.io.*; public class MyPrintStreamTest2{ public s ...

  2. [20160707]Java中如何关闭Frame窗口

    用户类继承自WindowAdapter,而窗口对象Frame作为用户类的数据成员. 1 import java.awt.*; import java.awt.event.*; public class ...

  3. <a href=”#”>与 <a href=”javascript:void(0)” 的区别

    <a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...

  4. jQuery清除文本框,内容并设置不可用

    JQuery清除文本框,内容并设置不可用  如果是设置只读,则将disabled换成readonly function CleanText(textid) { $("#"+text ...

  5. switch/ifelse 使用总结

    2015年3月30日 14:12:36 switch 中的 default  和 if/else  中最后的 else 尽可能的不要用 1. 不要default, 不要写默认处理逻辑, default ...

  6. Windows下用python编写简单GUI程序的方法

    Python实现GUI简单的来说可以调用Tkinter库,这样一般的需求都可以实现,显示简单的windows窗口代码如下: python_gui.py #!C:\Python27\python.exe ...

  7. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  8. 解决VM虚拟机MAC OS X 10.10.x的卡顿问题

    点此链接下载beamoff安装到虚拟机即可.

  9. mybatis一对多查询

    18 <!-- 19 方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 20 封装联表查询的数据(去除重复的数据) 21 select * from class c, teacher ...

  10. NEFU 506&&ZOJ 3353 Chess Board (四种构造的高斯消元)

    题目链接 题意:有四种翻转方式,问是否能使得所有棋子都变为0,求最小步数. 题解:依次构造枚举求出最小值即可. #include <iostream> #include <cstdi ...