设计模式之装饰者模式

 

一、对象增强的手段

  • 继承:增强的内容是固定的,不能动,被增强的对象也是固定;
  • 装饰者模式:增强的内容是固定,被增强的对象可以切换;
  • 动态代理(AOP):被增强的对象可以切换(Service),增强的内容也可以切换(事务处理)

二、装饰者模式

1、装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代理继承关系,更加灵活,同时避免类型体系的快速膨胀。

2、例子:

  Java API 中的 IO流

  ①字节:InputStream、OutputStream

  ②字符:Reader、Writer

  InputStream

  FileInputStream:它是节点流,就是和一个自由绑定在一起的,文件

  BufferedInputStream:它是装饰流,创建我是一定要给我一个底层对象,然后我不管你给我什么流,我都给它创建缓冲区。

  new BufferedInputStream(任意的InputStream)

FileInputStream in = new FileInputStream("url");

BufferedInputStream b = new BufferedInputStream(in);

ObjectInputStream o  = new ObjectInputStream(b);

三、实现细节

  装饰者和被装饰者实现共同的接口,将被装饰者对象传入装饰者中。

  • Component:抽象构件角色

    • 被装饰对象和装饰对象有相同的接口。这样,客户端对象就能够以与被装饰对象相同的方式与装饰对象交互。

  • ConcreteComponent:具体构件角色(被装饰对象)

  • Decorator:装饰角色

    • 持有一个抽象构件的引用。装饰对象接收所有客户端的请求,并把这些请求转发给真实的对象(被装饰对象)。这样,就能在真实对象(被装饰对象)调用前后增加新的功能。

  • ConcreteDecorator:具体装饰角色

    • 负责给真实对象(被装饰对象)增加新的功能。

四、简单的应用介绍

  装饰:不知道被增强对象的具体类型时,可以使用:是你还是你,一切拜托你!

 1 //装饰者与被装饰者需实现相同的接口,MyConnection类为装饰者,con为被装饰对象,Connection为两个类的相同接口
 2 
 3 class MyConnection implements Connection {
 4 
 5   //是你
 6   //还是你
 7   private Connection con;//底层对象,被增强对象
 8 
 9   public MyConnection(Connection con) {  //通过构造器传递底层对象
10     this.con = con;
11     }
12 
13   //一切拜托你,不需要增强的方法,直接调用底层的对象相应的方法即可
14   public Statement createStatement() {
15     return con.createStatement();
16   }
17 
18   //增强点,增强该底层对象某个特定的方法
19   public void close() {
20       //把当前连接归还给池
21   }
22 
23 }
24 
25 class Demo{
26     @Test
27     public void test(){
28         Connection con = 通过四大参数创建连接对象,是由mysql提供的。
29         //把需要增强的对象传入装饰者类中
30         Connection con1 =  new MyConnection(con);
31         //使用装饰后的对象,调用相应的方法
32         con1.close;
33     }
34 }

 

posted @ 2018-01-04 16:00  gdwkong  阅读(273)  评论(0编辑  收藏  举报