以辛巴克案例來闡述這一模式,星巴克有很多種單品咖啡,每個單品咖啡又可以加入很多調料,下面給出傳統的設計圖:
因為單品和調料組合的多樣性,這樣設計就極容易出現類**問題!
於是有人就對方案一進行改進,改進後的設計圖如下:
雖然這樣控制了類的數量,但增減調料時,**維護量就變得非常大,不利於後期擴充套件和維護,為了解決這一困擾,我們就引出了裝飾者模式:
**如下:
drink 類:
public
abstract
class
drink
public
void
setdes
(string des)
public
float
getprice()
public
void
setprice
(float price)
//計算費用的抽象方法
//子類來實現
public
abstract
float
cost()
;}
coffe:
public
class
coffee
extends
drink
}
單品類:
public
class
shortblack
extends
coffee
}
public
class
longblack
extends
coffee
}
裝飾者(decorator)
public
class
decorator
extends
drink
@override
public
float
cost()
@override
public string getdes()
}
調味品:
public
class
milk
extends
decorator
}
public
class
soyextends
decorator
}
public
class
chocolate
extends
decorator
}
客戶端呼叫:
設計模式之 裝飾者模式
一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...
設計模式之裝飾者模式
此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...
設計模式之裝飾者模式
public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...