装饰者模式-结构型

原理

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

 装饰器模式提供了改变子类的灵活方案。装饰器模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

 

UML图

在装饰模式中的角色有:

  抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

  具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

  装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

  具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

装饰者模式-结构型

 

装饰模式的特点

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。

(2) 装饰对象包含一个真实对象的索引(reference)

(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。

(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

 

与其他相关模式的区别

1)Adapter 模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口(IO是半透明的,有些装饰者增加了接口没有的方法);而适配器将给对象一个全新的接口。

2)Composite组合模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责—它的目的不在于对象聚集

3)Strategy策略模式:用一个装饰你可以改变对象的外表;而Strategy模式使得你可以改变对象的内核。这是改变对象的两种途径。

 

 

public class IOTest {

    public static void main(String[] args) throws IOException {
        // 流式读取文件
        DataInputStream dis = null;
        try{
            dis = new DataInputStream(
                    new BufferedInputStream(
                            new FileInputStream("test.txt")
                    )
            );
            //读取文件内容
            byte[] bs = new byte[dis.available()];
            dis.read(bs);
            String content = new String(bs);
            System.out.println(content);
        }finally{
            dis.close();
        }
    }

}

观察上面的代码
会发现最里层是一个FileInputStream对象,
然后把它传递给一个BufferedInputStream对象,经过BufferedInputStream处理,
再把处理后的对象传递给了DataInputStream对象进行处理,
这个过程其实就是装饰器的组装过程。
FileInputStream对象相当于原始的被装饰的对象,而BufferedInputStream对象和DataInputStream对象则相当于装饰器。

 

上一篇:Android -- Camera源码简析,启动流程


下一篇:paxos协议