1. 程式人生 > >java設計模式03裝飾者者模式

java設計模式03裝飾者者模式

eal java設計 擴展 支持 其他 java設計模式 代理 rate 一個

動態地給一個對象添加一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴展對象的功能。

(1)在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。

(2)處理那些可以撤消的職責。

(3)當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的 子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。

最經典的莫過於java的io流結構設計

對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個 接口。對代理模式來說,代理類(proxy class)和真實處理的類(real class)都實現同一個接口。此外,不論我們使用哪一個模式,都可以很容易地在真實對象的方法前面或者後面加上自定義的方法。

然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。裝飾器模式關註於在一個對象上動態的添加方法,然而代理模式關註於控制對對象的訪問。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隱藏一個對象的具體信息。因此,當使用代理模式的時候,我們常常在一個代理類中創建一個對象的實例。並且,當我們使用裝飾器模 式的時候,我們通常的做法是將原始對象作為一個參數傳給裝飾者的構造器。

我們可以用另外一句話來總結這些差別:使用代理模式,代理和真實對象之間的的關系通常在編譯時就已經確定了,而裝飾者能夠在運行時遞歸地被構造。

java設計模式03裝飾者者模式