設計模式--裝飾者模式
基本介紹
- 裝飾者模式:動態的將新功能附加到對象上。在對象功能擴展方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(ocp)
- 這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
- 星巴克咖啡訂單項目:
咖啡種類/單品咖啡:Espresso(意大利濃咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(無因咖啡)
調料: Milk、Soy(豆漿)、Chocolate
要求在擴展新的咖啡種類時,具有良好的擴展性、改動方便、維護方便
使用OO的來計算不同種類咖啡的費用:客戶可以點單品咖啡,也可以單品咖啡 + 調料組合
案例:
新建抽象類 Drink
@Data
public abstract class Drink {
private String des;
private float price = 0.0f;
//子類實現
public abstract float cost();
}
新建coffee類繼承 抽象類
public class Coffee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
新建咖啡種類 :意大利咖啡
public class Espresso extends Coffee{
public Espresso() {
setDes(" 意大利咖啡");
setPrice(6.0f);
}
}
新建咖啡種類 :longBlack
public class LongBlack extends Coffee{
public LongBlack() {
setDes(" longBlack");
setPrice(7.0f);
}
}
新建裝飾類
public class Decorator extends Drink{
private Drink obj;
@Override
public float cost() {
//自己價格
return super.getPrice() + obj.cost();
}
public Decorator(Drink obj) {
this.obj = obj;
}
@Override
public String getDes() {
return "" + super.getPrice() + "&&" + obj.getPrice();
}
}
新建配料 :牛奶
public class Milk extends Decorator{
public Milk(Drink obj) {
super(obj);
setDes("牛奶");
setPrice(2.0f);
}
}
新建配料 :牛奶
public class Chocolate extends Decorator{
public Chocolate(Drink obj) {
super(obj);
setDes(" 巧克力 ");
setPrice(3.0f);
}
}
新建配料 :巧克力
public class Chocolate extends Decorator{
public Chocolate(Drink obj) {
super(obj);
setDes(" 巧克力 ");
setPrice(3.0f);
}
}
新建配料 :豆漿
public class Soy extends Decorator{
public Soy(Drink obj) {
super(obj);
setDes(" 豆漿 ");
setPrice(1.5f);
}
}
購買coffee
public class CoffeeBar {
public static void main(String[] args) {
//1。點一份 logBlack
Drink order = new LongBlack();
System.out.println("費用1 …… " + order.cost());
System.out.println("描述" + order.getDes());
//2. 加入一份牛奶
order = new Milk(order);
System.out.println("加入牛奶過後的費用" + order.cost());
System.out.println("描述" + order.getDes());
//3. 加入一份巧克力
order = new Chocolate(order);
System.out.println("加入牛奶 + 巧克力 過後的費用" + order.cost());
System.out.println("描述" + order.getDes());
}
}
在JDK 源碼中 Java的 IO 結構 FilterInputStream就是一個裝飾者