装饰器模式
装饰器模式动态的将责任附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。
装饰器模式,如果大家使用过java.io包下的字节流或者字符流就应该比较熟悉了。这里先列举一下IO包下的相关类
使用装饰器模式设计一个关于饮料的java代码实现
下面是一个饮料的抽象类,有一个描述熟悉和抽象的价格方法。默认的描述方法返回未知名称的饮料,价格方法则由子类去自己实现
1 2 3 4 5 6 7 8 9 10
| public abstract class Beverage { private String description="Unknow Beverage"; public String getDescription() { return description; } public abstract double cost(); }
|
下面是带有调料的装饰器,继承了饮料类,抽象了描述方法。
1 2 3
| public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
|
具体的抹茶饮料继承了调料类,实现了描述,和价格方法,同时在构造方法中传入了饮料对象。
在具体实现描述和价格方法中,使用到了饮料类的方法,在此之上做了一些改动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Mocha extends CondimentDecorator { private Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return this.beverage.getDescription() + ", Mocha"; } @Override public double cost() { return this.beverage.cost() + .20; } }
|
以上,装饰着做得事就是增加行为到被包装的对象上。
但是 装饰器模式有一个缺点,从Java IO流的API可以看出,利用装饰器模式,常常造成设计中有大量的小类,数量太多了会造成使用者的困扰。