情景:
你是一个咖啡店老板,你会做很多种咖啡。
首先有一个超类,饮料类。
咖啡可以加很多种调料,就假设是A,B,C……
那么你会有AB型的,AC型,BC型,A型的,B型,C型,ABC型的咖啡,那么你需要有六种具体子类。
如果有n种调料,你就要有(2^n-1)种具体子类有木有啊!!!
同时,如果,你添加了一种调料或者改变一种调料!!!会死人呐有木有!!!
怎么办?? 可以考虑使用组合(compisition)和委托(delegation)。
装饰者模式
以饮料为主体,然后在运行时,以调料来装饰(decorate)饮料。
设饮料价格是X,加了调料A,可以用A把X包装起来A(X),又加了调料B,再用B把A(x)包装起来,B(A(X))。
- 装饰着和被装饰者具有相同的超类型。
- 你可以用一个或多个装饰者包装一个对象。
- 既然装饰者和被装饰者对象具有相同的超类型,所以在任何需要原始对象(被包装的)的场合,都可以用装饰过的对象代替它。
- 对象可以在任何时候被装饰,可以在运行时动态地,不限量地用你喜欢的装饰者来装饰对象。
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
类图:
解决最开始的咖啡问题~~
首先饮料类:
= "Unknown Beverage"
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getDescription() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> description;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">double</span><span style="color: #000000;"> cost();
}
然后是两种具体的饮料
Espresso = "Espresso" 1.99
<div class="cnblogs_code">
HouseBlend = "House Blend Coffee" 0.89