Java 装饰器模式详解

🔍 一、模式定义

装饰器模式(Decorator Pattern)是一种‌结构型设计模式‌,通过组合(而非继承)动态扩展对象功能,保持接口一致性且遵循开闭原则。其核心思想是‌运行时功能叠加‌,典型应用包括Java I/O流体系(如BufferedInputStream包装FileInputStream)。


🧩 二、核心角色

角色职责示例
Component定义被装饰对象的抽象接口(如InputStreamCoffee接口
ConcreteComponent实现基础功能的具体类(如FileInputStreamSimpleCoffee
Decorator持有Component引用并实现其接口的抽象装饰类CoffeeDecorator抽象类
ConcreteDecorator添加具体扩展功能(如加密、缓冲等)MilkDecorator

⚙️ 三、实现原理

  1. 基础结构
    装饰器与被装饰对象实现相同接口,通过嵌套包装实现功能叠加:

    // 抽象组件
    interface DataSource {
        void writeData(String data);
        String readData();
    }
    
    // 具体组件
    class FileDataSource implements DataSource {
        // 基础实现...
    }
    
    // 抽象装饰器
    abstract class DataSourceDecorator implements DataSource {
        protected DataSource wrappee;
        public DataSourceDecorator(DataSource source) {
            this.wrappee = source;
        }
    }
    
    // 具体装饰器:加密功能
    class EncryptionDecorator extends DataSourceDecorator {
        @Override
        public void writeData(String data) {
            wrappee.writeData(encrypt(data)); // 功能增强
        }
        private String encrypt(String data) { /*...*/ }
    }
    
  2. 客户端调用
    通过多层嵌套实现功能组合:

    Coffee coffee = new SugarDecorator(new MilkDecorator(new SimpleCoffee()));
    System.out.println(coffee.getDescription()); // 输出:"咖啡 + 牛奶 + 糖"
    

🌟 四、模式优势

  1. 灵活扩展‌:动态添加/撤销功能,避免继承导致的子类爆炸。
  2. 透明性‌:装饰后对象与原对象接口一致,客户端无感知。
  3. 符合开闭原则‌:无需修改原有代码即可扩展功能。

⚠️ 五、适用场景

  1. 需要动态扩展功能‌(如为咖啡添加调料、为数据流增加缓冲)。
  2. 无法使用继承‌(如final类或需多维度扩展)。
  3. 避免复杂子类层次‌(如GUI组件样式组合)。

🔄 六、与其他模式对比

对比项装饰器模式代理模式
目的增强对象功能控制对象访问(如延迟加载、权限校验)
调用关系装饰器调用被装饰对象代理类隐藏真实对象实现
典型应用Java I/O流、Spring AOP增强MyBatis Mapper代理、RPC远程调用

📌 七、注意事项

  1. 避免过度装饰‌:多层嵌套可能降低代码可读性和性能。
  2. 与继承的权衡‌:简单功能扩展可直接用继承,复杂组合场景用装饰器。
  3. 接口一致性‌:确保所有装饰器实现统一接口,否则会破坏透明性。

通过合理使用装饰器模式,可显著提升代码的扩展性和维护性,尤其在需要动态功能组合的场景中优势明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值