定义: 在不改变原有对象的基础上,将功能附加到对象上。提供了更有弹性的替代方案。
在学习装饰者模式时,经常使用的一个例子是卖煎饼果子,现在我们就化身小贩来卖煎饼果子。我们规定一个鸡蛋饼 5 元,一个肉饼 7 元,一个煎蛋 1 元,一个烤肠 2 元,一包辣条 1 元。
若我们不使用设计模式编程,我们可能需要定义许多的类,比如:加一个煎蛋的鸡蛋饼,加一个烤肠的鸡蛋饼,加一个煎蛋的肉饼等等。
现在我们可以用装饰者模式解决这个问题:
1. 定义抽象的饼
abstract class Pie{
String desc = "饼的抽象";
public String getDesc(){
return desc;
}
public abstract double getPrice();
public String toString(){
return getDesc()+":"+getPrice();
}
}
2. 定义肉饼
class MeatPie extends Pie {
MeatPie(){
desc = "肉饼";
}
public double getPrice(){
return 7.0;
}
}
3. 定义鸡蛋饼
class EggPie extends Pie{
public EggPie(){
desc = "鸡蛋饼";
}
public double getPrice(){
return 5.0;
}
}
4. 定义抽象的配料
abstract class Condiment extends Pie{
public abstract String getDesc();
}
5. 定义火腿
class Ham extends Condiment{
private Pie pie;
public Ham(Pie pie){
this.pie = pie;
}
@Override
public double getPrice() {
return 2+pie.getPrice();
}
@Override
public String getDesc() {
return pie.getDesc()+"+火腿";
}
}
6.定义煎蛋
class FireEgg extends Condiment{
private Pie pie;
public FireEgg(Pie pie){
this.pie = pie;
}
@Override
public double getPrice() {
return 1+pie.getPrice();
}
@Override
public String getDesc() {
return pie.getDesc()+"+煎蛋";
}
}
7. 测试
Pie pie = new MeatPie();
System.out.println(pie);
pie = new FireEgg(pie);
System.out.println(pie);
pie = new Ham(pie);
System.out.println(pie);
总结:
我们可以看出,装饰者模式包含:1. 抽象的组件 2. 具体的组件/抽象的装饰者 3. 具体的装饰者
thanks: