最近看了一篇關於裝飾者模式的文章,深有體會,感覺在某種特定情況下通過裝飾者模式來思考和組織**真的是非常方便,下面我們通過乙個例子來理解這裡所說的「某種特定情況」。
最近哥開了一家開心花甲粉的小吃店,不知道你去過沒有,沒有的話應該去嘗試一下,挺好吃的。
開心花甲粉是一家麵條類的小吃店,主要的配料有:
面(公尺線、河粉、桂林公尺粉...)、油、鹽、醬油、水、辣椒、胡椒粉、雞蛋、蝦、花甲(一種殼類生物)、魷魚、生蠔、肉丸、金針菇、香菜...
根據配料,我們能夠組合多種花甲粉:
花甲粉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 ...