结构型之装饰器模式

总则

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

装饰器模式

  • uml类图


    装饰器模式.PNG
  • 代码

  public interface Component {
        void method();
    }

    public class ConcreteComponent implements Component{
        public void method() {
            System.out.println("原来的方法");
        }
    }

    public abstract class Decorator implements Component{
        protected Component component;

        public Decorator(Component component) {
            super();
            this.component = component;
        }

        public void method() {
            component.method();
        }
    }

    public class ConcreteDecoratorA extends Decorator{

        public ConcreteDecoratorA(Component component) {
            super(component);
        }

        public void methodA(){
            System.out.println("被装饰器A扩展的功能");
        }

        public void method(){
            System.out.println("针对该方法加一层A包装");
            super.method();
            System.out.println("A包装结束");
        }
    }

    public class ConcreteDecoratorB extends Decorator{

        public ConcreteDecoratorB(Component component) {
            super(component);
        }

        public void methodB(){
            System.out.println("被装饰器B扩展的功能");
        }

        public void method(){
            System.out.println("针对该方法加一层B包装");
            super.method();
            System.out.println("B包装结束");
        }
    }

    public class Main {

        public static void main(String[] args) {
            Component component =new ConcreteComponent();//原来的对象
            System.out.println("------------------------------");
            component.method();//原来的方法
            ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(component);//装饰成A
            System.out.println("------------------------------");
            concreteDecoratorA.method();//原来的方法
            concreteDecoratorA.methodA();//装饰成A以后新增的方法
            ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(component);//装饰成B
            System.out.println("------------------------------");
            concreteDecoratorB.method();//原来的方法
            concreteDecoratorB.methodB();//装饰成B以后新增的方法
            concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);//装饰成A以后再装饰成B
            System.out.println("------------------------------");
            concreteDecoratorB.method();//原来的方法
            concreteDecoratorB.methodB();//装饰成B以后新增的方法
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容