设计模式-装饰模式 Java

模式概述

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有对象动态添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,用于包装原有的类,提供了比继承更有弹性的替代方案。

核心思想:通过组合而非继承的方式,在运行时动态地扩展对象功能,遵循"开闭原则"(对扩展开放,对修改关闭

简单代码示例

java 复制代码
// 1. 抽象构件
interface DataSource {
    void writeData(String data);
    String readData();
}

// 2. 具体构件
class FileDataSource implements DataSource {
    private String filename;
    
    public FileDataSource(String filename) {
        this.filename = filename;
    }
    
    @Override
    public void writeData(String data) {
        System.out.println("Writing data to file: " + data);
    }
    
    @Override
    public String readData() {
        return "Data from file";
    }
}

// 3. 抽象装饰类
abstract class DataSourceDecorator implements DataSource {
    protected DataSource wrappee;
    
    public DataSourceDecorator(DataSource source) {
        this.wrappee = source;
    }
}

// 4. 具体装饰类 - 加密装饰器
class EncryptionDecorator extends DataSourceDecorator {
    public EncryptionDecorator(DataSource source) {
        super(source);
    }
    
    @Override
    public void writeData(String data) {
        String encrypted = encrypt(data);
        wrappee.writeData(encrypted);
    }
    
    @Override
    public String readData() {
        String data = wrappee.readData();
        return decrypt(data);
    }
    
    private String encrypt(String data) {
        return "ENCRYPTED(" + data + ")";
    }
    
    private String decrypt(String data) {
        return data.replace("ENCRYPTED(", "").replace(")", "");
    }
}

// 5. 具体装饰类 - 压缩装饰器
class CompressionDecorator extends DataSourceDecorator {
    public CompressionDecorator(DataSource source) {
        super(source);
    }
    
    @Override
    public void writeData(String data) {
        String compressed = compress(data);
        wrappee.writeData(compressed);
    }
    
    @Override
    public String readData() {
        String data = wrappee.readData();
        return decompress(data);
    }
    
    private String compress(String data) {
        return "COMPRESSED[" + data + "]";
    }
    
    private String decompress(String data) {
        return data.replace("COMPRESSED[", "").replace("]", "");
    }
}

// 客户端代码
public class DecoratorDemo {
    public static void main(String[] args) {
        // 基本文件数据源
        DataSource source = new FileDataSource("data.txt");
        
        // 添加加密功能
        DataSource encryptedSource = new EncryptionDecorator(source);
        encryptedSource.writeData("Sensitive data");
        System.out.println("Read encrypted: " + encryptedSource.readData());
        
        // 添加压缩和加密功能
        DataSource secureSource = new CompressionDecorator(
                                  new EncryptionDecorator(source));
        secureSource.writeData("Large sensitive data");
        System.out.println("Read compressed & encrypted: " + secureSource.readData());
    }
}

技术细节

1.模式组成

组件 职责说明
抽象构件 定义对象接口,可以动态添加职责
具体构件 实现Component接口,定义要添加功能的对象
抽象装饰类 继承Component,维护一个Component对象的引用
具体装饰类 向构件添加具体职责

2.优缺点

优点:

  • 比继承更灵活,符合开闭原则,无需修改现有代码
  • 支持运行时动态添加或移除功能

缺点:

  • 会产生大量小对象,增加系统复杂性
  • 多层装饰时调试困难

模式应用

I/O流是装饰器模式的完美范例,它通过装饰器模式为基本的I/O操作提供了灵活而强大的扩展能力