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

Java 裝飾者模式深度解析:從火鍋點餐看動態擴展職責的藝術

     編輯:Java 綜合教學

模式定義與適用場景

裝飾者模式(Decorator Pattern)允許在不改變原對象前提下,動態、透明地為單個對象添加職責。相比繼承生成子類,組合方式更靈活,避免「類爆炸」。

適用場景:

  1. 需在不影響其他對象時,動態給單一對象增減職責;
  2. 職責可撤銷(可動態拆裝);
  3. 無法採用繼承(類被 final、大量獨立擴展組合導致子類爆炸)。

核心角色(以火鍋點餐為喻)

角色火鍋對應代碼體現
Component(抽象被裝飾者)鍋底接口GuoDi 接口
ConcreteComponent(具體被裝飾者)鴛鴦鍋底、大龍燚原味鍋底YuanYang、DaLongYan 實現類
Decorator(抽象裝飾者)配菜抽象基類PeiCai 抽象類,持有 GuoDi 引用
ConcreteDecorator(具體裝飾者)麻辣牛肉、大刀毛肚、天味香腸…MaLaNiuRou、MaoDu 等具體類

代碼實戰

1. 抽象被裝飾者

public interface GuoDi {
    float cost();   // 價格
    String name();  // 名稱
}

2. 具體鍋底

public class YuanYang implements GuoDi {
    public float cost() { return 48.0f; }
    public String name() { return "鴛鴦鍋底"; }
}
public class DaLongYan implements GuoDi {
    public float cost() { return 59.0f; }
    public String name() { return "大龍燚火鍋原味鍋底"; }
}

3. 抽象裝飾者(關鍵:組合而非繼承)

public abstract class PeiCai implements GuoDi {
    protected GuoDi guodi;
    public PeiCai(GuoDi guodi) { this.guodi = guodi; }
    public float cost() { return guodi.cost(); }
    public String name() { return guodi.name(); }
}

4. 具體配菜

public class MaLaNiuRou extends PeiCai {
    public MaLaNiuRou(GuoDi guodi) { super(guodi); }
    public float cost() { return super.cost() + 46f; }
    public String name() { return super.name() + "+麻辣牛肉"; }
}
public class MaoDu extends PeiCai {
    public MaoDu(GuoDi guodi) { super(guodi); }
    public float cost() { return super.cost() + 30f; }
    public String name() { return super.name() + "+大刀毛肚"; }
}

5. 客戶端組裝

public class Test {
    public static void main(String[] args) {
        GuoDi guodi = new DaLongYan();           // 1. 點鍋底
        GuoDi y = new MaLaNiuRou(guodi);         // 2. 加麻辣牛肉
        GuoDi x = new MaoDu(y);                  // 3. 再加大刀毛肚
        System.out.println("一共點了 " + x.name() + ", 共消費 " + x.cost());
    }
}

輸出結果

一共點了 大龍燚火鍋原味鍋底+麻辣牛肉+大刀毛肚, 共消費 135.0

設計精髓總結

  • 接口一致性:裝飾者實現同一接口,對客戶端透明;
  • 遞疊組合:每層裝飾持有下層引用,職責層層疊加;
  • 開放封閉:新增配菜只需新建 ConcreteDecorator,零修改既有代碼;
  • 靈活拆裝:運行時動態決定裝飾層數與順序,繼承無法做到。

現實映射:下次去成都,我請你吃遍大龍燚所有配菜組合!

火鍋愉快 走不動道

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