基本概念
装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP)。
基本原理
- 装饰者模式就像打包一个快递:主体:陶瓷,衣服等(Component)被装饰着;包装:报纸填充,塑料泡沫等(Decorator)装饰者
- Component:主体
- ConcreteComponent和Decorator:ConcreteComponent:具体的主体;Decorator:装饰者
- 在如图的Component和ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象成一个类。
案例:星巴克咖啡订单
- 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡),Decaf(无因咖啡)
- 调料:Milk、Soy(豆浆)、Chocolate
- 要求在扩展新的咖啡种类时,具有良好的扩展性,改动方便,维护方便
- 使用OO计算不同种类咖啡的费用:客户可以点单品咖啡,也可以点单品咖啡+调料组合。
- UML图:
说明:Drink就是前面所说的抽象类,Component;ShortBlack就是单品咖啡;Decorator是一个装饰类,含有一个被装饰的对象(Drink drink);Decorator的cost发费进行一个费用的叠加计算,递归的计算价格
- 主要代码:
1)Drink
public abstract class Drink {
public String desc;
private float price = 0.0f;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public abstract float cost();
}
2)Coffee:
public class Coffee extends Drink {
public float cost() {
return super.getPrice();
}
}
3)具体单品咖啡类Espresso:
public class Espresso extends Coffee {
public Espresso() {
setDesc(" 意大利咖啡 ");
setPrice(6.0f);
}
}
4)装饰者Decorator:
public class Descorator extends Drink {
private Drink drink;
public Descorator(Drink drink) {
this.drink = drink;
}
public float cost() {
return getPrice() + drink.cost();
}
public String getDesc() {
return desc + " && " + drink.getDesc();
}
}
5)具体装饰者Milk:
public class Milk extends Descorator {
public Milk(Drink drink) {
super(drink);
setPrice(2.0f);
setDesc(" 牛奶 ");
}
}
6)这样,你在使用时就可以这样使用:
public class CoffeeBar {
public static void main(String[] args) {
Drink drink = new Espresso();
System.out.println(drink.cost());
System.out.println(drink.getDesc());
drink = new Milk(drink);
System.out.println(drink.cost());
System.out.println(drink.getDesc());
drink = new Soy(drink);
System.out.println(drink.cost());
System.out.println(drink.getDesc());
}
}
是不是很方便??