装饰者模式动态的将功能(需要扩展的东西)附加的对象上,所以对于扩展功能,装饰者模式提供了比继承更有弹性的方案。而装饰者模式也完全符合 开发--关闭(对扩展开放,对修改关闭)的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、装饰者模式在设计中会出现许多小对象,如果过度使用,将会使程序便的很复杂