Java 装饰器模式详解

一、模式定义

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


二、核心角色

角色 职责 示例
Component 定义被装饰对象的抽象接口(如InputStream Coffee接口
ConcreteComponent 实现基础功能的具体类(如FileInputStream SimpleCoffee
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. 接口一致性‌:确保所有装饰器实现统一接口,否则会破坏透明性。

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

你可能感兴趣的:(java,装饰器模式,开发语言)