装饰器模式

2021-04-14  本文已影响0人  lj72808up

装饰器模式

  1. 思想: 组合优于继承

  2. JDK 的 IO 流就是使用包装模式对流进行各种增强
    如下代码, 用 BufferedInputStream 增强 FileInputStream 的读取功能.

    • 装饰类: BufferedInputStream
    • 原始类: FileInputStream
    • 装饰类和原始的共同父类: InputStream
    new BufferedInputStream(new FileInputStream())
    
  3. 为什么装饰类和原始类要继承同一个父类?

    • 因为装饰类和原始类都是对父类某种功能的扩充, 所以要继承同一个父类.比如: BufferedInputStream读取到 buffer 的角度增强; FileInputStream 是从文件来源的角度增强
    • 装饰类又要对原始类做扩充, 所以拥有一个原始类属性. 从而实现类的组合. 比如: 从 BufferedInputStream 的构造函数就可以看出
  4. 代理模式和装饰其模式都是为了增强类的功能, 他们的区别是什么?

    • 代理模式中,代理类附加的是跟原始类无关的功能,
    • 装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。

    设计模式往往是出发点的不同, 写法上往往很类似.(除了继承, 就是实现接口, 属性注入进行累的组合等) 比如下面的代理模式和装饰器模式, 如果让装饰类改为实现接口, 则代码和代理模式一模一样.

// 代理模式的代码结构(下面的接口也可以替换成抽象类)
public interface IA {
  void f();
}
public class A impelements IA {
  public void f() { //... }
}
public class AProxy implements IA {
  private IA a;
  public AProxy(IA a) {
    this.a = a;
  }

  public void f() {
    // 新添加的代理逻辑
    a.f();
    // 新添加的代理逻辑
  }
}

// 装饰器模式的代码结构(下面的接口也可以替换成抽象类)
public interface IA {
  void f();
}
public class A implements IA {
  public void f() { //... }
}
public class ADecorator implements IA {
  private IA a;
  public ADecorator(IA a) {
    this.a = a;
  }

  public void f() {
    // 功能增强代码
    a.f();
    // 功能增强代码
  }
}
上一篇下一篇

猜你喜欢

热点阅读