設計模式------------裝飾者模式

設計模式總覽


裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。


適用性
以下情況使用Decorator模式
1. 需要擴展一個類的功能,或給一個類添加附加職責。
2. 需要動態的給一個對象添加功能,這些功能可以再動態的撤銷。
3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變的不現實。
4. 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因爲類定義被隱藏,或類定義不能用於生成子類。


優點
1. Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合。


缺點
1. 這種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。
2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。
3. 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行爲,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。


模式簡化

1. 如果只有一個Concrete Component類而沒有抽象的Component接口時,可以讓Decorator繼承Concrete Component。
2. 如果只有一個Concrete Decorator類時,可以將Decorator和Concrete Decorator合併。


實例分析:

要求:實現一個支持+、-、*、%的計算器。數據類型有隻int、double。還有實現複合式。如:1+2*(3+5)

ps:運算符可能會有拓展,日後可能會有平方,開放等操作。


設計:

1、根據開閉原則,對可能的拓展進行抽象。所以要對運算符進行抽象。如圖:


若要添加新的運算,只需要根據操作數的個數,來實現相應的派生類。


2、實現複合式

要實現複合式,就要將Ele_complex與int、double再進行一次抽象。如圖


到此,整個設計方案就成了“裝飾者模式”


下面來看看,裝飾者模式能不能滿足計算器。重新來看看裝飾者模式的特點:

1、裝飾對象和真實對象有相同的接口。

滿足,只有這樣才能實現基本數據與複合式的組合,從而實現複合式功能。

2、裝飾對象包含一個真實對象的引用

滿足,當然對於兩個操作數的運算,甚至不止一個真實對象

3、 支持拓展

滿足


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章