1 装饰器模式(Decorator)能够在运行时动态地为原始对象增加一些额外的功能,使其变得更加强大
    2 装饰器 和 被装饰的类 实现了 相同的接口,构造装饰器实例时,将被装饰的实例传入装饰器,然后在调用方法的时候,增强功能,再调用 被装饰者的函数

    1. public interface Showable{
    2. public void show(); //增强的函数
    3. }
    4. public class Girl implements Showable{
    5. ...show(){...};
    6. }
    7. public class Decorator implements Showable{
    8. Showable showable;
    9. public Decorator(Showable showable){...}
    10. ...show(){ ...;showable.show();..;}
    11. }

    3 在装饰器内 写死了 增强的操作, 不利于扩展 ,可以对其进行抽象

    1. public abstract class Decorator implements Showable{
    2. protected Showable showable;
    3. public Decorator(Showable showable){...}
    4. public void show(){showable.show();}
    5. }

    4 随后 构建 不同的 Decorator ,并覆写 show()

    1. public class DecoratorOne extends Decorator(){
    2. ...;
    3. ...show(){...};
    4. }

    5 抽象后,还可以将多个装饰器 组合起来,可以增强所有的方法

    1. Showable a = new DecoratorTwo(new DecoratorOne(Girl))

    6 这种类似于套娃的结构,在Java的io流中可以见到

    1. new BufferedInputStream(new ZipInputStream(new FileInputStream(...)))

    image.png
    7 客户需求是多变且无法预估的,要实现不同功能的自由组合,以“继承”的方式来完成是不现实的,会造成子类泛滥,维护或扩展起来举步维艰

    8 而装饰器模式可以将不同功能的单个模块规划至不同的装饰器类中,各装饰器类独立自主,各司其职。客户端可以根据自己的需求自由搭配各种装饰器,每加一层装饰就会有新的特性体现出来,巧妙的设计让功能模块层层叠加,装饰之上套装饰,最终使原始对象的特性动态地得到增强。