裝飾器模式
設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所采用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
裝飾器模式通過將對象包裝在裝飾器類中,以便動態地修改其行為。https://huoyundi.com/
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的實例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
裝飾器模式
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
裝飾器模式通過將對象包裝在裝飾器類中,以便動態地修改其行為。
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的實例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
概要
意圖
動態地給一個對象添加額外的職責,同時不改變其結構。裝飾器模式提供了一種靈活的替代繼承方式來擴展功能。
主要解決的問題
- 避免通過繼承引入靜態特征,特別是在子類數量急劇膨脹的情況下。
- 允許在運行時動態地添加或修改對象的功能。
使用場景
- 當需要在不增加大量子類的情況下擴展類的功能。
- 當需要動態地添加或撤銷對象的功能。
實現方式
- 定義組件接口:創建一個接口,規定可以動態添加職責的對象的標準。
- 創建具體組件:實現該接口的具體類,提供基本功能。
- 創建抽象裝飾者:實現同樣的接口,持有一個組件接口的引用,可以在任何時候動態地添加功能。
- 創建具體裝飾者:擴展抽象裝飾者,添加額外的職責。
關鍵代碼
- Component接口:定義了可以被裝飾的對象的標準。
- ConcreteComponent類:實現Component接口的具體類。
- Decorator抽象類:實現Component接口,并包含一個Component接口的引用。
- ConcreteDecorator類:擴展Decorator類,添加額外的功能。
應用實例
- 孫悟空的72變:孫悟空(ConcreteComponent)通過變化(Decorator)獲得新的能力。
- 畫框裝飾畫:一幅畫(ConcreteComponent)可以通過添加玻璃(ConcreteDecorator)和畫框(ConcreteDecorator)來增強其展示效果。
優點
- 低耦合:裝飾類和被裝飾類可以獨立變化,互不影響。
- 靈活性:可以動態地添加或撤銷功能。
- 替代繼承:提供了一種繼承之外的擴展對象功能的方式。
缺點
- 復雜性:多層裝飾可能導致系統復雜性增加。
使用建議
- 在需要動態擴展功能時,考慮使用裝飾器模式。
- 保持裝飾者和具體組件的接口一致,以確保靈活性。
注意事項
- 裝飾器模式可以替代繼承,但應謹慎使用,避免過度裝飾導致系統復雜。
結構
裝飾器模式包含以下幾個核心角色:
- 抽象組件(Component):定義了原始對象和裝飾器對象的公共接口或抽象類,可以是具體組件類的父類或接口。
- 具體組件(Concrete Component):是被裝飾的原始對象,它定義了需要添加新功能的對象。
- 抽象裝飾器(Decorator):繼承自抽象組件,它包含了一個抽象組件對象,并定義了與抽象組件相同的接口,同時可以通過組合方式持有其他裝飾器對象。
- 具體裝飾器(Concrete Decorator):實現了抽象裝飾器的接口,負責向抽象組件添加新的功能。具體裝飾器通常會在調用原始對象的方法之前或之后執行自己的操作。
裝飾器模式通過嵌套包裝多個裝飾器對象,可以實現多層次的功能增強。每個具體裝飾器類都可以選擇性地增加新的功能,同時保持對象接口的一致性。
實現
我們將創建一個 Shape 接口和實現了 Shape 接口的實體類。然后我們創建一個實現了 Shape 接口的抽象裝飾類 ShapeDecorator,并把 Shape 對象作為它的實例變量。
RedShapeDecorator 是實現了 ShapeDecorator 的實體類。
DecoratorPatternDemo 類使用 RedShapeDecorator 來裝飾 Shape 對象。
步驟 1
創建一個接口:
Shape.java
步驟 2
創建實現接口的實體類。
Rectangle.java
Circle.java
步驟 3
創建實現了 Shape 接口的抽象裝飾類。
ShapeDecorator.java
步驟 4
創建擴展了 ShapeDecorator 類的實體裝飾類。
RedShapeDecorator.java
步驟 5
使用 RedShapeDecorator 來裝飾 Shape 對象。
DecoratorPatternDemo.java
步驟 6
執行程序,輸出結果:
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red

浙公網安備 33010602011771號