1、本章的例子——咖啡店
咖啡店提供几种咖啡,每种咖啡都可以加不同的小料,一旦组合起来会有非常多种类的咖啡
![](https://img.haomeiwen.com/i9002551/0109441b9211d287.png)
2、设计原则
类应该对扩展开放,对修改关闭
- 把注意力集中在设计中最有可能改变的地方,然后应用开闭原则
3、装饰者模式
动态地将责任附加在对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案
![](https://img.haomeiwen.com/i9002551/39292c81ce865c5b.png)
- 装饰者和被装饰者有相同的超类
- 可以用一个或多个装饰者包装一个对象
- 装饰者可以替代被装饰者
- 装饰者通常会通过装饰加上自己的行为(算小料价格)
- 对象可以在任何时候被装饰
![](https://img.haomeiwen.com/i9002551/ee5b21adb27b9d81.png)
4、咖啡装饰
![](https://img.haomeiwen.com/i9002551/da2299201abd6e05.png)
- 将咖啡产品组合到了小料装饰类中,这样就可以任意添加小料了
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
public class Espresso extends Beverage {
public Espersso () {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public class Mocca extends CondimentDecorator {
Beverage beverage; // 被装饰者
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
// 开放变化
public double cost() {
return .20 + beverage.cost();
}
}
![](https://img.haomeiwen.com/i9002551/05113657a616ccf3.png)
5、java中的装饰者
![](https://img.haomeiwen.com/i9002551/bd6e51142110521e.png)
网友评论