大话设计模式-第6章 穿什么有这么重要?--装饰模式- 高飞网

第6章 穿什么有这么重要?--装饰模式

2016-02-01 17:18:59.0

装饰模式(Decorator,美[ˈdɛkəˌretɚ]:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。  

下面是装饰模式类图:

Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义了具体的对象,也可以给这个对象添加职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component的功能,但对Component来说是无需知道Decorator的存在的。ConcreteDecorator就是具体的装饰对象,起到给Component动态添加职责的功能。  

    最初情况下没有装饰器,Component只有一个实现类,现在想扩展它的功能,于是就创建一个装饰器Decorator,它有两个方法,一个是实现Component的operation接口,另外一个可以设置被执行的组件对象component,这样在执行扩展对象接口的时候,可以首选调用父类(即Decorator)的operation接口,如果这里设置的是ConcreteComponent对象,则先执行它,再执行自己的operation方法。

    下面是基本代码

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

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

/**
* 装饰器
*/
public class Decorator extends Component{
        /**
         * 装饰器用来装饰被包装对象的行为
         */
        private Component component;
        public void setComponent(Component component){
                this.component = component;
        }

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

/**
* 具体的装饰器实现A
*/
public class ConcreteDecoratorA extends Decorator{
        private String addedState;//本类独有的属性

        public void operation(){
                super.operation();
                System.out.println("具体的装饰对象A的操作.");
        }
}

/**
* 具体的装饰器实现B
*/
public class ConcreteDecoratorB extends Decorator{
        public void operation(){
                super.operation();
                System.out.println("具体的装饰对象B的操作.");
        }

        public void addedBehover(){
                System.out.println("本类独有的方法.");
        }
}

public class App{
        public static void main(String[] args){
                Component c = new ConcreteComponent();
                ConcreteDecoratorA da = new ConcreteDecoratorA();      
                ConcreteDecoratorB db = new ConcreteDecoratorB();      
               
                da.setComponent(c);
                db.setComponent(da);
                db.operation();

        }
}


总结

    装饰模式是为已有功能动态添加更多功能的一种方式。传统的做法是向旧的类中添加新代码,这些新代码通常装饰了原有类的核心职责或主要行为。但这种做法的问题在于,它们在主类中新加入的字段、方法和逻辑会增加主类的复杂度。而这些方式仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为。使用装饰模式,会把每个要装饰的功能放到一个单独的类中,并让这个类包装它所要装饰的对象。因此,当要执行特殊行为时,客户端代码就可以根据需要有选择地,按顺序地使用装饰功能包装对象。

优点:把类中装饰功能从类中移除出去,这样可以简化原有的类;有效地把类的核心职责和装饰功能分开了。而且可以去除相关类中复生的装饰逻辑。