**執行結果如下圖:
**說明
weapon是抽象構件角色。
rifle是具體構件角色,實現抽象構件的介面。
decorator是裝飾角色。裝飾角色有兩個特點,一是繼承了抽象構件的介面,二是有乙個構件角色的例項。
enhance和wear是具體裝飾角色,它們負責給構件附加責任。
客戶端在使用裝飾角色的時候並沒有針對抽象構件進行程式設計,因為我們確實需要使用具體裝飾角色提供的額外方法,這種型別的裝飾叫做半透明裝飾。
何時採用
從**角度來說,如果你覺得由於功能的交叉擴充套件不會導致非常多的子類或者非常多的繼承層次的話可以考慮裝飾模式。
從應用角度來說,如果你希望動態給類賦予或撤銷一些職責,並且可以任意排列組合這些職責的話可以使用裝飾模式。
實現要點
讓裝飾角色還繼承抽象構件角色也是裝飾模式最大的特點,目的就是給抽象構件增加職責,對外表現為裝飾後的構件。
讓裝飾角色擁有構件角色例項的目的就是讓構件能被多個裝飾物件來裝飾。
在具體應用中可以靈活一點,不一定要有抽象構件和裝飾角色。但是,裝飾物件繼承裝飾物件並且擁有它例項的兩大特點需要體現。
透明裝飾一般通過在基類方法前後進行擴充實現,半透明裝飾一般通過新的介面實現。
注意事項
裝飾模式和橋接模式的區別是,前者是針對功能的擴充套件,本質上還是一樣東西,而後者針對多維護變化。裝飾模式的思想在於擴充套件介面而橋接模式的思想是分離介面。
裝飾類可能會比較瑣碎,並且不利於復用,裝飾模式在增加了靈活性的同時也降低了封裝度,在實際應用中可以和其它模式配合。
無廢話C 設計模式之二 Singleton
意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做 web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分配使用者到各個伺服器上去。需要考慮的問題是...
無廢話C 設計模式之九 Proxy
意圖 為其他物件提供一種 以控制對這個物件的訪問。場景 模式非常常用,大致的思想就是通過為物件加乙個 來降低物件的使用複雜度 或是提公升物件使用的友好度 或是提高物件使用的效率。在現實生活中也有很多 的角色,比如明星的經紀人,他就是一種 經紀人為明星處理很多對外的事情,目的是為了節省被 物件也就是明...
(原創)無廢話C 設計模式系列文章
本系列文章從公司內部的知識分享修改而來,有錯誤或誤導請指出。謝謝。原創 無廢話c 設計模式之一 開篇 原創 無廢話c 設計模式之二 singleton 原創 無廢話c 設計模式之三 abstract factory 原創 無廢話c 設計模式之四 factory method 原創 無廢話c 設計模式...