装饰者模式

在不必改变原类文件和使用继承的情况下, 动态地扩展一个对象的功能.

结构

  • 抽象构件: 具体构件和抽象装饰都是抽象构件的子类
  • 具体构件
  • 抽象装饰
  • 具体装饰

      mybatis -> org.apache.ibatis.cache.Cache
    

    装饰者模式

    Demo

    抽象构件(被装饰类)
    abstract class House {
    
      public abstract void door();
      public abstract void window();
    }
    
    具体构件(具体被装饰的类)
    public class BigHouse extends House {
    
      @Override
      public void door() {
          System.out.println("大房子的门");
      }
    
      @Override
      public void window() {
          System.out.println("大房子的窗户");
      }
    }
    
    抽象装饰

    继承抽象构件, 并实现方法

    abstract class Decorate extends House {
    
      private House house;
    
      public Decorate(House house) {
          this.house = house;
      }
    
      @Override
      public void door() {
          house.door();
      }
    
      @Override
      public void window() {
          house.window();
      }
    }
    
    具体装饰

    具体装饰的构造一般传入被装饰类

    public class WallpaperDecorate extends Decorate {
    
      public WallpaperDecorate(House house) {
          super(house);
      }
    
      @Override
      public void door() {
          this.addWallpaper();
          super.door();
      }
    
      private void addWallpaper() {
          System.out.println("为门添加墙纸");
      }
    }
    
    public class WindowDecorate extends Decorate {
    
      public WindowDecorate(House house) {
          super(house);
      }
    
      @Override
      public void window() {
          this.addGlass();
          super.window();
      }
    
      private void addGlass(){
          System.out.println("为窗户添加玻璃");
      }
    }
    

总结

  • 和继承相比, 可以更灵活的扩展一个类的功能, 并且扩展组合方式较多
  • 同样和继承相比, 更容易出错

   版权声明

文章作者: liuzhihang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源!

 上一篇
适配器模式 适配器模式
将一个接口转换成客户希望的另一个接口, 使接口不兼容的那些类可以一起工作, 其别名为包装器(Wrapper).
2018-12-06
下一篇 
外观模式 外观模式
外观模式又称为门面模式, 为子系统中的一组接口提供一个统一的入口.主要作用是通过客户端统一调用外观角色, 降低系统的复杂程度.
2018-12-04