美文网首页
装饰器模式

装饰器模式

作者: lj72808up | 来源:发表于2021-04-14 16:25 被阅读0次

    装饰器模式

    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();
        // 功能增强代码
      }
    }
    

    相关文章

      网友评论

          本文标题:装饰器模式

          本文链接:https://www.haomeiwen.com/subject/suqllltx.html