设计模式装饰

装饰模式


设计原则:遵循迪米特、单一职责、开闭原则,破坏里氏替换,体现功能复用
常用场景:一个类需要动态的添加功能,且这些功能可以相互叠加
使用概率:99.99999%
复杂度:中
变化点:动态添加的功能或者说装饰器
选择关键点:添加的功能是否需要动态组装
逆鳞:无


主要思想:
创建装饰类继承或实现 需要被装饰类相同的父类或接口
持有被装饰类实例
调用被装饰类方法在前后可增加功能

和代理模式的区别在于,理论上装饰模式不控制持有的对象,只是增加一些装饰
代理模式理论上,被代理类是不可直接用的,持有代理对象,可控制其执行与否


public interface MyInterface {
    public void do1();
    public void do2();
}



public class MyClass implements MyInterface {
    @Override
    public void do1() {
        System.out.println("my do1");
    }

    @Override
    public void do2() {
        System.out.println("my do2");
    }
}


public class MyDecrator implements MyInterface{

    private MyInterface myInterface;

    public MyDecrator(MyInterface myInterface) {
        this.myInterface = myInterface;
    }

    @Override
    public void do1() {
        System.out.println("装饰前1");
        myInterface.do1();
        System.out.println("装饰后1");
    }

    @Override
    public void do2() {
        System.out.println("装饰前2");
        myInterface.do2();
        System.out.println("装饰后2");
    }
}