• 设计模式之装饰者模式


    一、对象增强的手段

    • 继承:增强的内容是固定的,不能动,被增强的对象也是固定;
    • 装饰者模式:增强的内容是固定,被增强的对象可以切换;
    • 动态代理(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 }
  • 相关阅读:
    【C#】项目优化实战
    【NoSql】Redis
    【算法】非递归的方式生成树
    工作4年的一些想法
    【NoSql】MongoDb
    【微信开发】 前端
    【微信开发】常用 api
    [MVC] DIV 布局
    [Swift] 疑难杂症
    《你不懂我,我不怪你》
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8193284.html
Copyright © 2020-2023  润新知