《大话设计模式》——装饰模式

装饰模式优点:将类中原有的装饰功能移出,作为单独的一个或几个对象。简化了原有的类,同时又可以动态的为类增加某一项或某几项装饰,而不必修改原类。有效的把类的核心职责和装饰功能区分开来,并且去除相关类中重复的装饰逻辑。同时让类在某些特定的时候,才拥有某些特定的功能。

常用场景:加密数据、过滤词汇。

装饰模式中的角色可以分为:

1、component:对象接口,可以对对象动态的添加装饰。是所有类的顶端接口。

2、decorator:装饰类。是所有装饰对象的父类。在这里set和get被添加装饰的对象。

3、concrete:具体的对象,可以被添加装饰。

4、decoratorA:具体装饰类。类中有特有的装饰,可以添加给具体的对象。

例子:

component

inteface Component {
    public void say();    
}

concrete

public class Concrete implement Component {
    public void say(){
        System.out.println("我是Concrete");
    }  
}

decorator

public class Decorator implement Component {
    private Component component;

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

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

    public Component getComponent(){
        return component;
    }

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

decoratorA

public class DecoratorA extend Decorator {
    private void A(){
        System.out.println("我被装饰了方法A");
    }

    public void say(){
        super.say();
        A();
    }

}

客户端

public static void main(String[] args) {
    Concrete c = new Concrete();
    DecoratorA d = new DecoratorA();    

    d.setComponent(c);
    d.say();
}

代码执行后,输出结果:

我是Concrete
我被装饰了方法A

在装饰模式中,装饰类可以有多个,例如DecoratorB,DecoratorC,DecoratorD。这些装饰类可以被自由地动态地为对象增加某些功能,并且互不影响,且不影响原功能。

如果用来被装饰的对象只有一种,则decorator类可以直接继承被装饰的对象。component不是必要存在的。

posted @ 2017-08-16 16:54  一响贪欢  阅读(284)  评论(0编辑  收藏  举报