zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式

    一、对象增强的手段

    • 继承:增强的内容是固定的,不能动,被增强的对象也是固定;
    • 装饰者模式:增强的内容是固定,被增强的对象可以切换;
    • 动态代理(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 }
  • 相关阅读:
    Java多态(更新中...)
    C语言free释放内存后为什么指针里的值不变?竟然还可以输出?
    LeetCode:344-反转字符串
    20150518 字符设备驱动
    20150517 Linux文件系统与设备文件系统
    20150514我读《深入理解linux内核》之虚拟文件系统笔记
    双系统Ubuntu下修复启动项的两种方法
    20150503 imx257下实现I2C驱动的四种方法
    20150502 调试分析之 使用gdb远程调试ARM开发板
    20150501 调试分析之 修改内核来定位系统僵死问题
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8193284.html
Copyright © 2011-2022 走看看