装饰器模式

装饰器模式动态的将责任附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。

装饰器模式,如果大家使用过java.io包下的字节流或者字符流就应该比较熟悉了。这里先列举一下IO包下的相关类

Java IO 流
Java 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可以看出,利用装饰器模式,常常造成设计中有大量的小类,数量太多了会造成使用者的困扰。