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

以卖饮料为例
代码实现
首先定义了一个抽象的饮料的父类,具有两个方法,分别是描述信息和价格
abstract class Drink{
String description="这是饮料";
public String getDescription(){
return description;
}
public abstract double cost();
}
其次定义了一个抽象的装饰类,只有一个描述方法
abstract class ComdientDecoration extends Drink{
public abstract String getDescription();
}
继而定义了两种coffee,继承了Drink父类,并重写了父类的描述信息的方法,实现了价格方法。
class Coffee1 extends Drink{
@Override
public String getDescription() {
return "Coffee1";
}
@Override
public double cost() {
return ;
}
}
class Coffee2 extends Drink{
@Override
public String getDescription() {
return "Coffee2";
}
@Override
public double cost() {
return ;
}
}
最后看一下装饰类,装饰材料有牛奶,摩卡。当我们加上辅料时,就需要在未加辅料的基础上加上辅料的价格,才是该类型饮料的真实价格。同理还需要在未加辅料的基础上加上辅料的信息形成该类型饮料的描述信息。所以在实现的时候,我们只需要调用饮料的cost方法再加上当前辅料的价格即可。同理描述信息的实现为调用饮料的getDescription方法在加上当前辅料组成新的描述信息
class Milk extends ComdientDecoration{
Drink drink;
public Milk(Drink drink){
this.drink=drink;
}
@Override
public String getDescription() {
return drink.getDescription()+", Milk";
}
@Override
public double cost() {
return drink.cost()+;
}
}
class Mocha extends ComdientDecoration{
Drink drink;
public Mocha(Drink drink) {
this.drink=drink;
}
@Override
public String getDescription() {
return drink.getDescription()+", Mocha";
}
@Override
public double cost() {
return drink.cost()+;
}
}
结果展示
优点
- 允许行为可以扩展,而无需修改现有的代码
- 可以用无数个装饰者装饰一个组件
缺点
- 使用装饰者模式容易出现许多小的对象类,如果过度使用,会使得程序变得很复杂
java中的装饰者模式
java中有许多类也使用到来了装饰者模式,比如文件操作,感兴趣的同学可以自行研究一下~