設計模式真香筆記-裝飾者模式
阿新 • • 發佈:2018-11-09
裝飾者模式的介紹
裝飾者模式:動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
實際中的裝飾者模式的例子:比如 java.io包的實現
裝配者模式通用的UML類圖
利用到的新原則
- 類應該對擴充套件開放,對修改關閉
飲料和配料的例子
例子裡面cost()的圖形理解
- Beverage(抽象抽象的元件類)
public abstract class Beverage {
String description = "Unknown description";
public String getDescription() {
return description;
}
public abstract double cost();
}
- CondimentDecorator(調料共同實現的介面 抽象類)
public abstract class CondimentDecorator extends Beverage {//調料抽象類
@Override
public abstract String getDescription();
}
- Espresso(具體飲料類 被裝飾者繼承Beverage抽象類)
public class Espresso extends Beverage {
public Espresso(){
description = "beverage.Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
- HouseBlend (具體飲料類 被裝飾者繼承Beverage抽象類)
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "House Blend Coffee";
}
@Override
public double cost() {
return 0.89;
}
}
- DarkRoast (具體飲料類 被裝飾者繼承Beverage抽象類)
public class DarkRoast extends Beverage {
public DarkRoast(){
description = "beverage.DarkRoast Coffee";
}
@Override
public double cost() {
return 0.99;
}
}
- Mocha(具體調味類 裝飾者繼承CondimentDecorator裝飾者抽象類)
public class Mocha extends CondimentDecorator {//具體裝飾者
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",beverage.Mocha";
}
@Override
public double cost() {
return 0.2+beverage.cost();
}
}
- Soy(具體調味類 裝飾者繼承CondimentDecorator裝飾者抽象類)
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",beverage.Soy";
}
@Override
public double cost() {
return 0.14+beverage.cost();
}
}
- Providecoffee測試類(具體如何通過裝飾者模式實現飲料的配料新增和價格的計算)
public class Providecoffee {//測試類
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+" "+beverage.cost()+"¥");
Beverage darkRoast = new DarkRoast();//製造出一個飲料物件
darkRoast = new Mocha(darkRoast);//用mocha調料裝飾飲料物件
darkRoast = new Mocha(darkRoast);//再用mocha調料裝飾飲料的物件
darkRoast = new Soy(darkRoast);//最後再用soy調料裝飾飲料的物件
System.out.println(darkRoast.getDescription()+" "+darkRoast.cost()+"¥");//暗含者遞迴的思想列印飲料的新增和價格
}
}
裝飾者模式的總結
- 繼承是一種擴充套件形式,但不是一定是最佳的方案。
- 裝飾者模式可以進行擴充套件
- 裝飾者模式意味著一群裝飾者包裝具體的元件
- 裝飾者會導致設計中出現許多小物件,太多了的話會讓程式變得很複雜。
本文參考 :《Head First 設計模式》