装饰者模式动态的将功能(需要扩展的东西)附加的对象上,所以对于扩展功能,装饰者模式提供了比继承更有弹性的方案。而装饰者模式也完全符合 开发--关闭(对扩展开放,对修改关闭)的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
我们可以看到FilterInputStream就是一个抽象的装饰者,如果对现有的java IO功能不满意,可以继承这个抽象类进行扩展。java.io中使用装饰者模式也造成了一个缺点,就是类特别多,相信每个初学者看到java.io都会蒙了。
总结:
1、 在设计中应该允许行为被扩展,无须修改现有的代码;
2、组合和委托可动态的给对象加上新的行为。
3、装饰者模式在设计中会出现许多小对象,如果过度使用,将会使程序便的很复杂