裝飾者模式

2021-07-29 11:56:38 字數 1427 閱讀 3013

最近看了一篇關於裝飾者模式的文章,深有體會,感覺在某種特定情況下通過裝飾者模式來思考和組織**真的是非常方便,下面我們通過乙個例子來理解這裡所說的「某種特定情況」。

最近哥開了一家開心花甲粉的小吃店,不知道你去過沒有,沒有的話應該去嘗試一下,挺好吃的。

開心花甲粉是一家麵條類的小吃店,主要的配料有:

面(公尺線、河粉、桂林公尺粉...)、油、鹽、醬油、水、辣椒、胡椒粉、雞蛋、蝦、花甲(一種殼類生物)、魷魚、生蠔、肉丸、金針菇、香菜...

根據配料,我們能夠組合多種花甲粉:

花甲粉1:面、油、鹽、水、胡椒粉、蝦、香菜;

花甲粉2:公尺線、油、鹽、水、辣椒、花甲、蝦、金針菇、香菜;

根據組合我們估計很難寫的完,這就意味著,我們在實現開心花甲粉這個系統的時候,如果將每種花甲粉作為乙個類錄入的話,這無疑就是和自己過不去,更關鍵的一點是,以後如果想要擴充套件出來,比如有客人他喜歡加些西洋菜在粉裡面,那又要在系統中錄入許多類,維護起來非常艱難。顯然,在這種情況下,我們已經不能夠為每種花甲粉定義乙個類了。

在這種非常關鍵的時候,裝飾者模式的強大設計力量就顯示出來。

那麼,具體怎麼做?

首先,我們明白,花甲粉是一種麵食,以面料為主,其他輔料都是為面料服務的,那麼

面、公尺線...就是被裝飾者,花甲、辣椒...就是裝飾者。

面、公尺線、花甲、辣椒...都屬於食材,嗯,我們可以把它們抽象成乙個食材類父類的子類。

在這裡我們的**是這樣的:

接著,我們將建立乙個公尺線的子類,這個類繼承自食材類,類名是mixian,

然後我們建立乙個輔料類,這個類是鹽、水、香菜、蝦...的父類。

同樣的,這個類首先繼承自食材類,**如下:

它有乙個初始化方法initwithingredients:withname:,意義在於通過配合其他食材進而生成新的食材,因為它們都繼承自食材類,這也是裝飾者模式的重點。

現在,我們來建立油、水、鹽、花甲、香菜、金針菇等配料類。

類名分別是:foodoil、water、salt、clam、caraway、needlemushroom。

現在,我們用上面列舉的食材來建立一種花甲粉,**如下:

執行這段**,控制台顯示:

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...