1.什么是装饰模式
装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。
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);
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END