首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 裝飾器模式深度解析:動態擴展對象功能的結構型設計模式

     編輯:Java 綜合教學

不修改原類、不繼承、不破壞接口:用組合替代繼承實現功能靈活疊加

裝飾器模式 是結構型模式經典實踐,通過包裝器在運行時動態給對象添加職責,避免了繼承導致的類爆炸與靜態綁定。本文以「形狀添加紅色邊框」為例,完整展示接口定義、抽象裝飾器、具體裝飾器、客戶端使用,並分析核心角色、優缺點、適用場景及 JDK 實戰應用。

一、 核心角色與類圖

  • Component (抽象構件):Shape 接口,定義 draw()。
  • ConcreteComponent (具體構件):Circle、Rectangle 實現 Shape。
  • Decorator (抽象裝飾器):ShapeDecorator 實現 Shape,持有 Shape 引用,轉發請求。
  • ConcreteDecorator (具體裝飾器):RedShapeDecorator 擴展 ShapeDecorator,在 draw() 前後添加紅框邏輯。

二、 完整代碼實現

// 1. Component
public interface Shape { void draw(); }

// 2. ConcreteComponent
public class Circle implements Shape {
    @Override public void draw() { System.out.println("Shape: Circle"); }
}
public class Rectangle implements Shape {
    @Override public void draw() { System.out.println("Shape: Rectangle"); }
}

// 3. Decorator (抽象裝飾器)
public abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;
    public ShapeDecorator(Shape decoratedShape) { this.decoratedShape = decoratedShape; }
    @Override public void draw() { decoratedShape.draw(); } // 默認轉發
}

// 4. ConcreteDecorator
public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); }
    @Override public void draw() {
        decoratedShape.draw(); // 核心功能
        setRedBorder(decoratedShape); // 新增功能
    }
    private void setRedBorder(Shape shape) { System.out.println("Border Color: Red"); }
}

// 5. Client
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape redCircle = new RedShapeDecorator(new Circle());
        Shape redRectangle = new RedShapeDecorator(new Rectangle());

        System.out.println("Circle with normal border"); circle.draw();
        System.out.println("\nCircle of red border"); redCircle.draw();
        System.out.println("\nRectangle of red border"); redRectangle.draw();
    }
}

三、 運行輸出

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red

四、 模式深度解析

維度說明
核心原則開閉原則:對擴展開放(新增裝飾器),對修改關閉(不動原類)。
關鍵技術組合 + 委派:裝飾器持有被裝飾者引用,接口一致,透明轉發。
動態性運行時任意組合:new RedBorder(new BlueBorder(new Circle())) 疊加多層裝飾。
優點1. 靈活擴展,避免繼承爆炸。2. 單一職責,每個裝飾器只管一項功能。3. 可運行時動態組合。
缺點1. 產生大量小對象,增加 GC 壓力。2. 多層裝飾調試困難(調用棧深)。3. 破壞具體類型身份 (instanceof 失效)。
適用場景1. 動態增強/撤銷功能。2. 職責疊加組合 (IO 流、日志、權限、緩存、壓縮、加密)。3. 無法繼承類 (final 類) 需擴展。

五、 JDK 經典實戰:java.io 流體系

// 裝飾器鏈:文件 → 緩衝 → 數據類型 → 對象序列化
InputStream is = new ObjectInputStream(
                    new DataInputStream(
                        new BufferedInputStream(
                            new FileInputStream("data.bin"))));
// 每層裝飾器添加一項能力:緩衝、基本類型讀取、對象反序列化
// 所有類均繼承自 InputStream (Component),構造器接收 InputStream (Decorator)

其他 JDK 例子:Collections.synchronizedList() (同步裝飾)、Collections.unmodifiableList() (只讀裝飾)、HttpServletRequestWrapper (請求包裝)。

六、 進階變體:靜態裝飾 / 函數式裝飾 (Java 8+)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved