一、装饰者模式基本介绍
- 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
- 这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。
案例实现
- 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)
- 调料:Milk、Soy(豆浆)、Chocolate
- 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
- 使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。
1、描述所有咖啡的共同属性
public abstract class Drink {
private String name;
private int price;
public abstract int cost();
public abstract String getDes();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
2、使用coffee继承drink
public class Coffee extends Drink{
@Override
public int cost() {
// TODO Auto-generated method stub
return super.getPrice();
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getName();
}
}
3、具体的单品类LongBlack
public class LongBlack extends Coffee{
public LongBlack() {
setName("LongBlack");
setPrice(12);
}
}
public class ShortBlack extends Coffee{
public ShortBlack() {
setName("ShortBlack");
setPrice(120);
}
}
4、Decorator 类,装饰者类
public class Decorator extends Drink{
private Drink drink;
public Decorator(Drink drink) {
this.drink = drink;
}
@Override
public int cost() {
return super.getPrice() + drink.cost();
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getName() + drink.getDes();
}
}
5、具体的配料继承装饰者类
public class Milk extends Decorator{
public Milk(Drink drink) {
super(drink);
setName("牛奶");
setPrice(15);
}
}
public class Espresso extends Decorator{
public Espresso(Drink drink) {
super(drink);
setName("Espresso");
setPrice(4);
}
}
5、测试
public class Client {
public static void main(String[] args) {
Drink drink = new LongBlack();//多态
System.out.println("单点一个LongBlack" + drink.cost());
drink = new Milk(drink);
System.out.println("单点一个LongBlack加牛奶" + drink.cost());
}
}