java设计模式学习(三)装饰者模式(decorator)

     装饰者模式动态的将功能(需要扩展的东西)附加的对象上,所以对于扩展功能,装饰者模式提供了比继承更有弹性的方案。而装饰者模式也完全符合 开发--关闭(对扩展开放,对修改关闭)的OO设计原则。

  中秋快到了,改吃月饼了

public abstract class Cake {

    String description="primary taste";

    public String getDescription() {
        return description;
    }
    
  public abstract double cost();  
}
定义一个抽象的饼类,然后装饰者和组件(被装饰者)都需要继承它

组件:

public class Mooncakes extends Cake{

    public Mooncakes() {
        this.description="Mooncake";
    }
    
    @Override
    public double cost() {
        // TODO Auto-generated method stub
        return 12.00;
    }

}
这个饼只是个“饼”,而不是我们需要的月饼,那么需要加点馅

public abstract class CondimentDecorator extends Cake{

    @Override
    public abstract String getDescription();
    @Override
    public  abstract double cost();

}
public class Peanut extends CondimentDecorator{

    Cake cake;
    public Peanut(Cake cake) {
        this.cake=cake;
    }
    
    @Override
    public String getDescription() {
        System.out.println(cake.getDescription());
        return cake.getDescription()+", Peanut";
    }

    @Override
    public double cost() {
        // TODO Auto-generated method stub
        return 1.10+cake.cost();
    }

}
OK,现在可以测试一把了

    public static void main(String[] args) {
        Cake cake= new Mooncakes();
        System.out.println(cake.description);
        Cake cake2= new Mooncakes();
        cake2=new Peanut(cake2);
        System.out.println(cake2.getDescription()+"::"+cake2.cost());
        
    }

输出:

Mooncake
Mooncake
Mooncake, Peanut::13.1


而更现实的装饰者模式的例子就是java.IO下的类,



我们可以看到FilterInputStream就是一个抽象的装饰者,如果对现有的java IO功能不满意,可以继承这个抽象类进行扩展。java.io中使用装饰者模式也造成了一个缺点,就是类特别多,相信每个初学者看到java.io都会蒙了。

总结:

1、 在设计中应该允许行为被扩展,无须修改现有的代码;

2、组合和委托可动态的给对象加上新的行为。

3、装饰者模式在设计中会出现许多小对象,如果过度使用,将会使程序便的很复杂

posted @ 2014-08-21 18:06  傾聽雨落  阅读(218)  评论(0编辑  收藏  举报