个人对装饰模式的简单理解:使用对象组合的方式为一个类添加功能
举个例子:我想使用把一段文字输入到文件中。
FileOutputStream fs = new FileOutputStream("src/Decoratorr/test.txt");
fs.write("aAbBcCbDeEfF".getBytes());
输出:
但我觉得直接输入到文件中文字太密不方便阅读。
这时我们想到可以实现一个装饰器装饰(增强)FileOutputStream使得输出的文字稀疏一点方便阅读
装饰器实现套路:
1.继承实现与被增强对象相同的接口
2,持有被增强对象的引用
3,实现需要被增强的方法(可以在被增强对象的方法基础增强也可以自己重新写)
实现一个SpacePlusOutputStream 使得输出的文字稀疏一点
public class SpacePlusOutputStream extends OutputStream {
// 2,持有被增强对象的引用
private OutputStream os=null;
public SpacePlusOutputStream(OutputStream os) {
super();
this.os = os;
}
// 3,实现需要被增强的方法(可以在被增强对象的方法基础增强也可以自己重新写)
@Override
public void write(int b) throws IOException {
this.os.write(b);
this.os.write(0);//每输出一个字符后面跟个空格
}
}
测试
SpacePlusOutputStream spo = new SpacePlusOutputStream(new FileOutputStream("src/Decoratorr/test.txt"));
spo.write("aAbBcCbDeEfF".getBytes());
输出:
这里我们可以看到达到了我们的预期效果
这里我们看到字符输出有大写有小写我想全部转换为小写更符合阅读习惯
于是我们再次实现一个LowerOutputStream装饰使得所有大写字符转化为小写字符
public class LowerOutputStream extends OutputStream {// 1.继承实现与被增强对象相同的接口
//2,持有被增强对象的引用
private OutputStream os=null;
public LowerOutputStream(OutputStream os) {
super();
this.os = os;
}
//3,实现需要被增强的方法(可以在被增强对象的方法基础增强也可以自己重新写)
@Override
public void write(int b) throws IOException {
if(b>=97&&b<=122)
{
os.write(b-32);
}
else
{
os.write(b);
}
}
}
测试
SpacePlusOutputStream spo = new SpacePlusOutputStream(new FileOutputStream("src/Decoratorr/test.txt"));
UpOutputStream ups=new UpOutputStream(spo);
ups.write("aAbBcCbDeEfF".getBytes());
输出:
这样我们就得到了我们想要的方便阅读的小写文本
装饰器顺序可以任意替换这次我们先用LowerOutputStream再用SpacePlusOutputStream来测试
测试:
UpOutputStream uop = new UpOutputStream(new FileOutputStream("src/Decoratorr/test.txt"));
SpacePlusOutputStream spo=new SpacePlusOutputStream(uop);
spo.write("aAbBcCbDeEfF".getBytes());
输出:
和预期的一样
参考资料:研磨设计模式,装饰器模式