天天看點

[設計模式]裝飾模式

•裝飾模式又名包裝(Wrapper)模式

•裝飾模式以對用戶端透明的方式擴充對象的功能,是繼承關系的一個替代方案

•裝飾模式以對客戶透明的方式動态的給一個對象附加上更多的責任。換言之,用戶端并不會覺得對象在裝飾前和裝飾後有什麼不同。

•裝飾模式可以在不創造更多子類的情況下,将對象的功能加以擴充。

•裝飾模式把用戶端的調用委派到被裝飾類。裝飾模式的關鍵在于這種擴充完全是透明的。

•裝飾模式是在不必改變原類檔案和使用繼承的情況下,動态的擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。

•裝飾模式的角色:

–抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。

–具體構件角色(Concrete Component):定義一個将要接收附加責任的類。

–裝飾角色(Decorator):持有一個構件(Component)對象的引用,并定義一個與抽象構件接口一緻的接口

–具體裝飾角色(Concrete Decorator):負責給構件對象“貼上”附加的責任。

•裝飾模式的特點:

–裝飾對象和真實對象有相同的接口。這樣用戶端對象就可以以和真實對象相同的方式和裝飾對象互動。

–裝飾對象包含一個真實對象的引用(reference)

–裝飾對象接收所有來自用戶端的請求。它把這些請求轉發給真實的對象。

–裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確定了在運作時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實作對給定類的功能擴充。

•裝飾模式

–用來擴充特定對象的功能

–不需要子類

–動态

–運作時配置設定職責

–防止由于子類而導緻的複雜和混亂

–更多的靈活性

–對于一個給定的對象,同時可能有不同的裝飾對象,用戶端可以通過它的需要選擇合适的裝飾對象發送消息。

•繼承

–用來擴充一類對象的功能

–需要子類

–靜态

–編譯時分派職責

–導緻很多子類産生

–缺乏靈活性

Component.java

ConcreteComponent.java

Decorator.java

ConcreteDecorator1.java

ConcreteDecorator2.java

Client.java

作者:SummerChill

出處:javascript:void(0)

本部落格為自己總結亦或在網上發現的技術博文的轉載。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。