02.11 裝飾模式的效果,需要動態代理來承託,你曉得嗎?客官,裡邊看!

裝飾模式(Decorator Pattern)的定義是“動態的給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比於生成子類更為靈活”,不過,使用Java的動態代理也可以實現裝飾模式的效果,而且其靈活性、適應性都會更強。

我們以卡通片《貓和老鼠》(Tom and Jerry)為例,看看如何包裝小Jerry讓它更強大。首先定義Jerry的類:老鼠(Rat類),代碼如下:

裝飾模式的效果,需要動態代理來承託,你曉得嗎?客官,裡邊看!

接下來,我們要給Jerry增加一些能力,比如飛行,鑽地等能力,當然使用繼承也很容易實現,但我們這裡只是臨時的為Rat類增加這些能力,使用裝飾模式更符合此處的場景,首先定義裝飾類,代碼如下:

裝飾模式的效果,需要動態代理來承託,你曉得嗎?客官,裡邊看!

此處定義了兩種能力:一種是飛行,另一種是鑽地,我們如果把這兩種屬性賦予到Jerry身上,那就需要一個包裝動作類了,代碼如下:

裝飾模式的效果,需要動態代理來承託,你曉得嗎?客官,裡邊看!

注意看doStuff方法,一個裝飾類型必然是抽象構建(Component)的子類型,它必須實現doStuff方法,此處的doStuff方法委託給了動態代理執行,並且在動態代理的控制器Handler中還設置了決定裝飾方式和行為的條件(即代碼中InvocationHandler匿名類中的if判斷語句),當然,此處也可以通過讀取持久化數據的方式進行判斷,這樣就更加靈活了。

抽象構建有了,裝飾類也有了,裝飾動作類也完成了,那我們就可以編寫客戶端進行調用了,代碼如下: 

裝飾模式的效果,需要動態代理來承託,你曉得嗎?客官,裡邊看!

此類代碼只一個比較通用的裝飾模式,只需要定義被裝飾的類及裝飾類即可,裝飾行為由動態代理實現,實現了對裝飾類和被裝飾類的完全解耦,提供了系統的擴展性。


分享到:


相關文章: