標籤:
“我要買一個裝東西的袋子”
——如果需要搬家裡的行李,這句話可能會發生在超市裡。
那麼,上述提到的三個名詞——“東西”、“袋子”和“行李”,應該是如關係:
(1)行李,是一樣東西
(2)袋子,也是一樣東西
(3)袋子,可以裝行李
通過以上三句話的關係,可以得出結論:第一,袋子可以裝東西,雖然其本身就是一樣東西;第二,裝了東西的袋子,還是一樣東西。所以,可以在行李的基礎上,不斷地套袋子,且不管加多少層,最後得到的還是一樣東西。
“袋子是東西,袋子可以裝東西,裝了東西的袋子仍是東西。”
——這是一句繞口的話。這篇文章所介紹的設計模式,就是在這句話的基礎上展開的,叫裝飾模式(或“封裝器模式”)。
【在軟體開發思想中,“行李”和“袋子”是具體的稱呼,“東西”是抽象的稱呼,它們之間的關係稱作“繼承”;抽象的名詞被稱為“父類”,具體的名詞被稱為“子類”。】
一句話解釋裝飾模式就是——用“東西”裝“東西”,裝了之後還是“東西”。
【“東西”既是“袋子”的父類,也是“行李”的父類,被稱為“共同父類”或“基類”。】
當我們需要為某部分行李(而不是全部行李)添加某些保護的時候(比如:防震、防水),只需要依次套上袋子(防震袋、防水袋)即可。
【“裝飾模式”,動態地給一個對象添加一些額外的功能。當有時候希望給某個對象而不是整個類添加一些功能時,可以考慮裝飾模式。需要說明的是,添加裝飾的順序是有關係的。】
值得一提的是,其中的“袋子”和“行李”兩個部分可以進一步發展成兩個分支。“袋子”可以進一步發展成“防震袋”、“防水袋”等若干類型,“行李”可以進一步發展成“甲的行李”、“乙的行李”等若干類型,且兩分支互不影響。
【裝飾類和被裝飾類可以獨立發展,不會相互耦合。】
所以,在日常生活打包過程中,可以寥寥幾句話完成對某部分行李的打包,例如:“把甲的行李拿過來,加個防震袋,再加個防水袋”;“把乙的行李拿過來,加個防水袋,再加一個壓縮氣壓袋”
【在各對象彼此不影響的情況下,以動態、透明公開的方式給某個單獨對象添加功能。但需要注意的是:過多層數的裝飾是比較複雜的,因此,盡量減少裝飾類的數量,以便降低系統的複雜度。】
虛擬碼:
東西 a = new 甲行李();
a = new 防震袋(a);
a = new 防水袋(a);
東西 b = new 乙行李();
b = new 防水袋(b);
b = new 壓縮氣壓袋(b);
【以基類類型為參數類型,傳入建構函式參數列表】
* 思維碰撞,不要忘了與好友分享!未來將推出“將電腦思維故事化”系列,謝謝大家的關注!*
將電腦思維故事化——之設計模式裝飾模式