装饰器模式
文章目录
定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
本质上来说,是通过组合或聚合,将对象包含于装饰类里,从而增添新的行为。装饰类实现了与对象相同的接口。
装饰类中包含 4 类对象:
- 抽象部件:对象与装饰类共同实现的接口。
- 具体部件:被装饰的对象。
- 基础装饰:拥有被装饰的对象的引用。
- 具体装饰类:具体实现新的行为。
代码实现:
抽象部件:
public interface IDataSource {
void write(String data);
}
具体部件:
public class DataSourceImp implements IDataSource {
@Override
public void write(String data) {
System.out.println(data);
}
}
基础装饰类:
public class DataSourceDecorator implements IDataSource {
private final IDataSource dataSource;
public DataSourceDecorator(IDataSource dataSource) {
this.dataSource = dataSource;
}
public void write(String data){
dataSource.write(data);
}
}
具体装饰类,用于加密:
public class EncryptionDecorator extends DataSourceDecorator{
public EncryptionDecorator(IDataSource dataSource) {
super(dataSource);
}
public void write(String data){
super.write(encrypt(data));
}
private String encrypt(String data) {
return "<encrypt>"+data+"</encrypt>";
}
}
具体装饰类,用于压缩:
public class CompressionDecorator extends DataSourceDecorator{
public CompressionDecorator(IDataSource dataSource) {
super(dataSource);
}
public void write(String data){
super.write(compress(data));
}
public String compress(String data){
return "<compress>"+data+"</compress>";
}
}
客户端调用:
IDataSource source = new EncryptionDecorator(
new CompressionDecorator(
new DataSourceImp()));
source.write("hello");
// 输出
// <compress><encrypt>hello</encrypt></compress>
装饰器模式的优点是:
- 无需新增子类即可扩展新的功能。
- 可以在运行时动态扩展新的功能。
缺点是多层的装饰会增加系统的复杂度。
文章作者 梧桐碎梦
上次更新 2023-04-22 11:08:17