1. 程式人生 > >Java設計模式之裝飾模式趣談

Java設計模式之裝飾模式趣談

JVM:”上次給我招的工人不錯啊!”

oo程式設計師:”………..”

JVM:”現在來我開的博物館生意越來越好了,原來”舞臺劇”的方式已經不能滿足顧客的需求了”

oo程式設計師:”………..”

JVM:”我決定要換一種運營模式,把每個演播廳都租出去,讓那些想表演節目的物件們來租演播廳和相關器械,這樣我就能坐地收錢了!”

oo程式設計師:”………..”

JVM:”合夥幹吧?怎麼樣?你三我七!”

oo程式設計師:”………..”

JVM:”四六?”

oo程式設計師:”成交!先說說需求。”

JVM:”首先有不同型別的演播廳和不同的裝飾品/器械,每種物品都要付一定的租金,你要做的就是一件事,把總租金(演播廳+飾品/器械)算出來。”

oo程式設計師:”把價格表給我!”

仔細一想也對,無論是演播廳還是裝飾品,都需要描述(description)和cost(價格),寫一個共同的父類無可厚非。

接著寫下你設計的第一個類:

第二個:

第三個:

。。。。。

沒有第三個了!這樣寫下去可是無窮無盡的!沒辦法,換個思路。

在演播廳裡,無論什麼裝飾品都有可能出現,可以把演播廳+飾品看成一個整體,通過飾品相應的has和set來控制飾品,這樣的話,設計出來的類如下:

這個看起來好多了,不用寫大爆炸數量的類,雖然類寫起來又臭(無數的has/set)又長(的確很長)。。。。。

但是有沒有更好的方案?

答案當然是有的,不過我們必須先明確一下,上述設計的缺點。

1.臭

2.長

3.當飾品的租金改變的時候,必須修改所有演播廳的程式碼(cost部分),我們當然不想這樣,我們想盡可能的少修改程式碼(鬆耦合)。

4.沒有面對超類/介面程式設計。

5.沒有將變化的部分獨立開。

6.組合可能是更好的解決方案。

下面讓我們看看。裝飾者模式是如何解決上面問題的。

裝飾者模式:動態的將責任加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

首先,我們先將演播廳和他的裝飾者們分開,讓裝飾者繼承另一個類:

讓裝飾者子類重新實現getDescription()即可。

現在我們的思路是:用裝飾者裝飾演播廳,例如,一個帶麥克風和氣球的卡通演播廳,就先讓氣球裝飾卡通演播廳,再讓麥克風裝飾“帶氣球的卡通演播廳”

先讓我們分別實現這3個類:

卡通演播廳:

氣球:

程式碼:

結果是正確的。

這樣寫很好的解決了上面的問題。

1.運用組合進行擴充套件,使當價格改變的時候,只需要修改本身的程式碼。

2.面對超類/介面程式設計,使飾品增加種類的時候,並不需要修改被裝飾者的程式碼。

3.開放——關閉原則 :程式碼應該對擴充套件開放,對修改關閉。

缺陷:

1.子類繁多,影響理解程式碼(java I/O就是裝飾者模式哦。。。)。

2.無法應用於需要具體類的場景。

3.更多資料免費