Fork me on GitHub

装饰者模式

1. 对象增强的手段

  • 继承
  • 装饰者模式
  • 动态代理(AOP)

2. 继承

2.1 特点
  • 增强的内容是固定的.
  • 被增强的对象也是固定的.
class 果汁类{ }

class 苹果汁类 extends 果汁类 { }

class 葡萄汁类 extends 果汁类 { }

class 柠檬汁类 extends 果汁类 { }

class 苹果柠檬类 extends 柠檬类 { }

class 葡萄柠檬类 extends 柠檬类 { }

// 增强内容使固定的: 苹果汁类只能增强苹果汁.
// 被增强的对象也是固定的: 增强的只能是果汁. 不能增强酒精类.

3. 装饰者模式

3.1 特点
  • 增强的内容是固定的.
  • 被增强的对象可以是任意的.
// 葡萄柠檬苹果汁类

果汁 A = new 苹果();
果汁 B = new 柠檬(A); // 对 A 装饰, 就是在苹果汁中加入柠檬
果汁 C = new 葡萄(B); // 对 B 装饰, 就是在苹果柠檬汁中加入葡萄

// 增强内容是固定的: 苹果只能增加苹果味, 葡萄只能增加葡萄味.
// 被增强的对象是任意的: 苹果可以增强酒精类.
3.2 使用场景
  1. 不知道被增强对象的具体类型时,可以使用!!
  2. 是你还有你, 一切拜托你!!
// dbcp 连接池的装饰者模式
// 装饰的是 MySQL 驱动的 Connection 对象

class MyConnection implements Connection{ // 是你

    // 还有你
    private Connection con;  // 底层对象, 被增强对象

    // 构造函数, 通过构造函数传递底层对象
    public MyConnection (Connection con){
        this.con = con;
    }

    // 一切拜托你, 大部分方法仍然直接调用被增强对象的方法
    public Statement createStatement(){
        return con.createStatement();
    }

    // 被增强部分
    public void close(){
        把当前连接归还给池.
    }
}

posted @ 2017-10-03 23:36  小a的软件思考  阅读(143)  评论(0编辑  收藏  举报