Java设计模式之装饰模式详解

Java设计模式之装饰模式详解


一、装饰模式核心思想

核心目标动态地为对象添加额外功能,通过组合替代继承,实现功能的灵活扩展。如同给礼物层层包装,每层包装都能增加新特性。


二、装饰模式类图(Mermaid)

组合
«interface»
Component
+operation() : String
ConcreteComponent
+operation() : String
«abstract»
Decorator
-component: Component
+operation() : String
ConcreteDecoratorA
-addedState: String
+operation() : String
ConcreteDecoratorB
+operation() : String
+addedBehavior() : String

三、代码实现示例

1. 咖啡加料场景

// 组件接口:饮品
interface Beverage {
    String getDescription();
    double cost();
}

// 具体组件:基础咖啡
class Espresso implements Beverage {
    public String getDescription() { return "浓缩咖啡"; }
    public double cost() { return 12.0; }
}

// 抽象装饰器
abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;
    
    public CondimentDecorator(Beverage beverage) {
        this.beverage = beverage;
    }
}

// 具体装饰器:牛奶
class Milk extends CondimentDecorator {
    public Milk(Beverage beverage) { super(beverage); }
    
    public String getDescription() {
        return beverage.getDescription() + " + 牛奶";
    }
    
    public double cost() {
        return beverage.cost() + 3.5;
    }
}

// 具体装饰器:焦糖
class Caramel extends CondimentDecorator {
    public Caramel(Beverage beverage) { super(beverage); }
    
    public String getDescription() {
        return beverage.getDescription() + " + 焦糖";
    }
    
    public double cost() {
        return beverage.cost() + 2.0;
    }
}

// 客户端调用
Beverage coffee = new Espresso();
coffee = new Milk(coffee);        
coffee = new Caramel(coffee);    

System.out.println(coffee.getDescription() + ",总价:" + coffee.cost());

四、模式优缺点分析

✅ 优势

  • 灵活扩展:运行时动态添加功能
  • 避免继承爆炸:N种基础组件×M种装饰 → N+M个类
  • 符合开闭原则:新增装饰类无需修改现有代码

❌ 缺点

  • 产生大量小类:可能增加系统复杂度
  • 装饰顺序敏感:不同顺序导致不同结果

五、典型应用场景

  1. IO流处理:Java的BufferedInputStream装饰FileInputStream
  2. GUI组件:为窗口添加滚动条、边框等装饰
  3. Web过滤器链:Servlet Filter层层处理请求
  4. 日志增强:为方法调用添加性能监控日志
  5. 权限校验:动态添加访问控制层

六、Mermaid序列图(多层装饰流程)

Client DecoratorA DecoratorB ConcreteComponent operation() operation() operation() Client DecoratorA DecoratorB ConcreteComponent

七、装饰模式 vs 其他模式

对比模式核心区别
代理模式控制访问,功能预定义
适配器模式改变对象接口
组合模式处理整体-部分关系

八、Java标准库应用案例

Java I/O 流体系

装饰
«abstract»
InputStream
+read() : int
FileInputStream
+read() : int
BufferedInputStream
-in: InputStream
+read() : int
DataInputStream
-in: InputStream
+readInt() : int
FilterInputStream

九、透明与半透明装饰模式

类型特点实现方式
透明模式完全保持组件接口装饰器仅增强现有方法
半透明模式装饰器添加新方法客户端需知道具体装饰类型

半透明模式示例

abstract class AdvancedDecorator extends Beverage {
    public abstract void extraFeature();
}

class WhippedCream extends AdvancedDecorator {
    public void extraFeature() {
        System.out.println("添加奶油造型");
    }
}

十、最佳实践建议

  1. 优先使用组合:装饰器持有组件对象而非继承
  2. 保持接口纯洁:尽量使用透明装饰模式
  3. 控制装饰层数:避免过度装饰导致性能下降
  4. 与工厂模式结合:通过工厂管理装饰过程

装饰不是继承的替代,而是补充

如果文章对你有帮助,帮忙点点关注吧,谢谢啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季鸢

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值