结构型-装饰模式

1.什么是装饰模式

装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。

image.png

2.案例

本例展示了如何在不更改对象代码的情况下调整其行为。最初的业务逻辑类仅能读取和写入纯文本的数据。 此后, 我们创建了几个小的封装器类, 以便在执行标准操作后添加新的行为。

第一个封装器负责加密和解密数据, 而第二个则负责压缩和解压数据。

你甚至可以让这些封装器嵌套封装以将它们组合起来。

2.1 抽象部件

DataSource.java

/**
 * com.example.design.structural.decorator
 * Description:
 * 部件
 * 声明装饰器和被封装对象的公用接口。
 *
 * @author jack
 * @date 2021/5/10 2:34 下午
 */
public interface DataSource {

    /**
     * 写文件
     *
     * @param data 文件名称
     */
    void writeData(String data);

    /**
     * 读文件
     *
     * @param data 文件名称
     */
    void readData(String data);

}
复制代码

2.2 具体部件

FileDataSource.java

/**
 * com.example.design.structural.decorator
 * Description:
 * 具体部件
 * 被封装对象所属的类。 它定义了基础行为, 但装饰类可以改变这些行为。
 *
 * @author jack
 * @date 2021/5/10 2:36 下午
 */
public class FileDataSource implements DataSource {

    private final String fileName;


    public FileDataSource(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void writeData(String data) {
        System.out.println("写入原文内容 FileDataSource writeData fileName:" + fileName + " data:" + data);
    }

    @Override
    public void readData(String data) {
        System.out.println("读取文件内容 FileDataSource readData fileName:" + fileName + " data:" + data);
    }
}
复制代码

2.3 基础装饰

DataSourceDecorator.java

/**
 * com.example.design.structural.decorator
 * Description:
 * 基础装饰类 (Base Decorator) 类拥有一个指向被封装对象的引用成员变量。 该变量的类型应当被声明为通用部件接口
 * 这样它就可以引用具体的部件和装饰。 装饰基类会将所有操作委派给被封装的对象。
 *
 * @author jack
 * @date 2021/5/10 2:42 下午
 */
public class DataSourceDecorator implements DataSource {

    protected DataSource wrapper;

    public DataSourceDecorator(DataSource dataSource) {
        this.wrapper = dataSource;
    }

    @Override
    public void writeData(String data) {
        wrapper.writeData(data);
    }

    @Override
    public void readData(String data) {
        wrapper.readData(data);
    }
}
复制代码

2.4 具体装饰

EncryptionDecorator.java

/**
 * com.example.design.structural.decorator
 * Description:
 * 具体装饰类 (Concrete Decorators) 定义了可动态添加到部件的额外行为。 具体装饰类会重写装饰基类的方法, 并在调用父类方法之前或之后进行额外的行为。
 *
 * @author jack
 * @date 2021/5/10 2:45 下午
 */
public class EncryptionDecorator extends DataSourceDecorator {

    public EncryptionDecorator(DataSource dataSource) {
        super(dataSource);
    }

    @Override
    public void writeData(String data) {
        System.out.println("写入数据加密");
        super.writeData(data);
    }

    @Override
    public void readData(String data) {
        System.out.println("读取数据解密");
        super.readData(data);
    }
}
复制代码

CompressionDecorator.java

/**
 * com.example.design.structural.decorator
 * Description:
 * 具体装饰类 (Concrete Decorators) 定义了可动态添加到部件的额外行为。 具体装饰类会重写装饰基类的方法, 并在调用父类方法之前或之后进行额外的行为。
 *
 * @author jack
 * @date 2021/5/10 2:45 下午
 */
public class CompressionDecorator extends DataSourceDecorator {

    public CompressionDecorator(DataSource dataSource) {
        super(dataSource);
    }

    @Override
    public void writeData(String data) {
        System.out.println("写入数据压缩");
        super.writeData(data);
    }

    @Override
    public void readData(String data) {
        System.out.println("读取数据解压");
        super.readData(data);
    }
}
复制代码

2.5 客户端

/**
 * com.example.design.structural.decorator
 * Description:
 * 客户端测试
 *
 * @author jack
 * @date 2021/5/10 2:48 下午
 */
public class Client {
    public static void main(String[] args) {
        String writeData = "写入数据 今天天气真热";
        // 明码数据写入文件
        DataSource fileDataSource = new FileDataSource("somefile.dat");

        // 压缩数据写入目标文件中
        fileDataSource = new CompressionDecorator(fileDataSource);

        // 压缩且加密的数据写入目标文件。
        fileDataSource = new EncryptionDecorator(fileDataSource);
        fileDataSource.writeData(writeData);

        System.out.println("============================");

        String readData = "读取数据 今天天气真热";
        fileDataSource.readData(readData);

    }
}
复制代码

image.png

借鉴:refactoringguru.cn/design-patt…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享