裝飾模式(Decorator Pattern)

2021-04-13 04:35:51 字數 2206 閱讀 9664

裝飾模式(decorator pattern

一句話

繼承乙個抽象類,加上自己的特點,然後再使自己也變成抽象類,然後讓子類繼承的模式,叫裝飾模式

意圖

動態地給乙個物件新增一些額外的職責。就增加功能來說,

decorator

模式相比生成子類更為靈活。

結構圖

生活中的例子

我們還是拿咖啡來舉例子,現在有需要泡一杯咖啡出來。泡咖啡的幾個步驟:

1.磨咖啡豆

2.煮。

先定義乙個介面

public inte***ce makecoffee

//來一杯藍山咖啡

public class

blue_mountain_coffee :

makecoffee

public void cook()

} 現在要來杯卡布奇諾

,那麼需要加入「做泡泡」的行為。

如果是按一般的方法,在介面內加入「做泡泡

(bubbles)

」的行為。但是這樣的話,做其他咖啡的時候都必須去實現

bubbles

的行為,這樣**就很羅嗦。

所以,我們引入乙個簡單的處理,

裝飾模式(decorator pattern

public abstract class decorator :

makecoffee

所有要做泡泡的咖啡都來繼承這個類。

//來一杯卡布奇諾咖啡

public class

: makecoffee

public void cook()

public void

bubbles

()

public void

makecoffee

()

}好了,打完收工。

裝飾模式解說

我們分析一下這樣會帶來什麼好處?首先對於擴充套件功能已經實現了真正的動態增加,只在需要某種功能的時候才進行包裝;其次,如果再出現一種新的擴充套件功能,只需要增加乙個對應的包裝子類(注意:這一點任何時候都是避免不了的),而無需再進行很多子類的繼承,不會出現子類的膨脹,同時

decorator

模式也很好的符合了物件導向設計原則中的「優先使用物件組合而非繼承」和「開放

-封閉」原則。

.net中的裝飾模式1

..net

中decorator

模式乙個典型的運用就是關於

stream

,它存在著如下的類結構:

如果只有乙個concretedecorator類,那麼就沒有必要建立乙個單獨的decorator類,而可以把decorator和concretedecorator的責任合併成乙個類。

5.decorator模式的優點是提供了比繼承更加靈活的擴充套件,通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。

6.由於使用裝飾模式,可以比使用繼承關係需要較少數目的類。使用較少的類,當然使設計比較易於進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關係更多的物件。更多的物件會使得查錯變得困難,特別是這些物件看上去都很相像。

適用性

在以下情況下應當使用裝飾模式: 1.

需要擴充套件乙個類的功能,或給乙個類增加附加責任。 2.

需要動態地給乙個物件增加功能,這些功能可以再動態地撤銷。 3.

需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變得不現實。

總結

decorator

模式採用物件組合而非繼承的手法,實現了在執行時動態的擴充套件物件功能的能力,而且可以根據需要擴充套件多個功能,避免了單獨使用繼承帶來的「靈活性差」和「多子類衍生問題」。同時它很好地符合物件導向設計原則中「優先使用物件組合而非繼承」和「開放

-封閉」原則。

設計模式 裝飾模式

裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...

設計模式 裝飾模式

剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...

設計模式 裝飾模式

複習設計模式 裝飾模式 裝飾模式 在不修改已經存在的類的情況下,動態的新增新的功能,實現即插即用,開放關閉原則 public inte ce man public class batman implements man override public void killmonster public ...