动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
以用滤镜处理图片的行为模式为例,其特点是:
1 滤镜有多种且可持续增加新类型
2 用户加滤镜的顺序是随机的
3 每次加滤镜需要叠加之前滤镜的效果
如果用装饰模式来表现,那么UML图是:
代码:
public interface Picture {
void show();
}
public class Painting implements Picture {
@Override
public void show() {
System.out.println("油画原画");
}
}
public abstract class Filter implements Picture {
protected Picture picture;
public Filter(Picture picture) {
this.picture = picture;
}
}
public class BlurFilter extends Filter {
public BlurFilter(Picture picture) {
super(picture);
}
@Override
public void show() {
this.picture.show();
System.out.println("添加虚化滤镜");
}
}
public class CutoutFilter extends Filter {
public CutoutFilter(Picture picture) {
super(picture);
}
@Override
public void show() {
this.picture.show();
System.out.println("添加木纹滤镜");
}
}
public class WaveFilter extends Filter {
public WaveFilter(Picture picture) {
super(picture);
}
@Override
public void show() {
this.picture.show();
System.out.println("添加波浪滤镜");
}
}
客户端:
public class Client {
public static void main(String[] args) {
Filter waveFilter = new WaveFilter(new Painting());
Filter blurFilter = new BlurFilter(waveFilter);
Filter cutoutFilter = new CutoutFilter(blurFilter);
cutoutFilter.show();
}
}
装饰器有一个经典示例就是java.io类库的设计,例如创建一个带有缓冲机制的文件读写器,其方法为:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));