设计原则:
1.类应该对扩展开放,对修改关闭
装饰模式
不修改任何底层代码的情况下,给对象赋予新的职责
应用场景:街边一个卖手抓饼的商贩,手抓饼(HandCake.java)的价格是1块,如果你需要加上别的小菜----鸡蛋,肉等等(Leeks.java,Pork.java,FiredEgg.java),那么你就需要加钱
如图是我们本次需要用到的类(这里只有继承)
image.png
1.Beverage.java(总的抽象类)
public abstract class Beverage {
private String desc = "Unknown Cake";;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
// 价格抽象
public abstract BigDecimal price();
}
2.Condiment.java(配料抽象类)
public abstract class Condiment extends Beverage{
public abstract String getDesc();
}
3.HandCake.java(手抓饼实现类)
public class HandCake extends Beverage {
public HandCake() {
this.setDesc("手抓饼");
}
@Override
public BigDecimal price() {
return BigDecimal.ONE;
}
}
4.FiredEgg.java(配料实现类)
public class FiredEgg extends Condiment {
private Beverage beverage;
public FiredEgg(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDesc() {
return beverage.getDesc() + ",鸡蛋";
}
public BigDecimal price() {
return beverage.price().add(BigDecimal.ONE);
}
}
5.Test.java(测试类)
public class Test {
public static void main(String[] arg){
Beverage beverage = new HandCake();
Console.log("类型:"+beverage.getDesc()+"===========价格:"+beverage.price());
beverage = new FiredEgg(beverage);
beverage = new FiredEgg(beverage);
beverage = new Pork(beverage);
beverage = new Leeks(beverage);
Console.log("类型:"+beverage.getDesc()+"===========价格:"+beverage.price());
}
}
运行结果
image.png
总结:装饰模式可以非常灵动的添加装饰者和委托者
heard First:
1.装饰者和被装饰者有着相同的超类;
2.你可以用一个或者多个装饰者包装一个对象;
3.既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰对象替换它。
4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定目的。
5.对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰着来装饰对象
网友评论