设计模式-装饰模式

装饰模式(Decorator), 动态给一个对象添加额外的职责(装饰)。

装饰模式主要应用于为已有的功能动态添加更多的功能(职责),如果需要扩展功能,只需要对旧的代码(类)进行包装(装饰)。 装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所需要装饰的对象。因此,当需要执行特殊行为时,客户端代码可以在运行时根据需要有选择地使用装饰功能来包装对象。

UML

decorator

抽象类:

    abstract class Component{
        public abstract void operation();
    }

具体对象类

    class ConcreteComponent extends Component{
        @Override
        public void operation(){
            System.out.println("具体操作对象");
        }
    }

抽象装饰类

   abstract class Decorator extends Component{
        protected Component component;

        public void setComponent(Component component){
            this.component = component;
        }

        @Override
        public void operation(){
            if(null != component){
                component.operation();
            }
        }
    }

装饰类1

    class ConcreteDecorator1 extends Decorator{
        @Override
       public void operation(){
           super.operation();
            addFeature();
       }

        public void addFeature(){
            System.out.println("新增功能1");
        }
    }

装饰类2

    class ConcreteDecorator2 extends Decorator{
        @Override
        public void operation(){
            super.operation();
            addBehavior();
        }

        public void addBehavior(){
            System.out.println("新增功能2");
        }
    }

客户端

    public static void main(String[] args) throws Exception{
        ConcreteComponent c = new ConcreteComponent();   
        ConcreteDecorator1 cd1 = new ConcreteDecorator1();
        ConcreteDecorator2 cd2 = new ConcreteDecorator2();

        cd1.setComponent(c);  //cd1装饰c
        cd2.setComponent(cd1); //cd2装饰已经装饰c的cd1
        cd2.operation();   //调用cd2的operation,cd2会调用cd1,cd1调用c的operation,
                           //然后再额外添加cd1的addFeature,然后再额外添加cd2的addBehavior
    }