俊介三

一天更新一点,一天积累一点

导航

Decorator Pattern

Posted on 2013-03-23 10:35  俊介三在前进  阅读(123)  评论(0)    收藏  举报

装饰者模式:当需要给对象添点数据,加点小功能时,这个模式最合适了。

这两个例子最典型:有一杯咖啡,可以给它加奶、加糖、加巧克力、加泡沫,有的消费者要加奶加糖的;有的要加巧克力加盐的;总之就是不同的小需求的对象的构建

Java IO 是典型的装饰者模式。InputSteam in = new LineNumberInputStream(new BuffredInputStream(new FileInputSteam); 把各种小需求加进这个输入流中。
缺点是:类太多了!!没有个类图,直接看它API烦得要死~

类图如下:

贴一个装饰者模式的例子:

public class DecoratorPattern {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Component c = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent()));
        System.out.println("cost="+c.getCost());
        System.out.println("description = "+c.getDescription());
    }

}

abstract class Component{
    String description;
    int cost;
    public int getCost(){
        return cost;
    }
    public String getDescription(){
        return description;
    }
}

abstract class Decorator extends Component{
    public abstract String getDescription();
    public abstract int getCost();
}

class ConcreteComponent extends Component{
    
    public ConcreteComponent(){
        description = "ConcreteComponent";
        cost =1;
    }
    @Override
    public int getCost(){
        return cost;
    }
    
    public String getDescription(){
        return description;
    }
}

class ConcreteDecorator1 extends Decorator{
    Component component;
    ConcreteDecorator1(Component c){
        component = c;
    }
    @Override
    public String getDescription() {
        // TODO Auto-generated method stub
        return component.getDescription()+" + ConcreteDecorator1";
    }
    
    public int getCost(){
        return 2+component.getCost();
    }
}

class ConcreteDecorator2 extends Decorator{
    Component component;
    ConcreteDecorator2(Component c){
        component = c;
    }
    @Override
    public String getDescription() {
        // TODO Auto-generated method stub
        return component.getDescription()+" + ConcreteDecorator2";
    }
    
    public int getCost(){
        return 6+component.getCost();
    }
}