装饰者模式是指在不改变原有对象的基础上,将功能附加到对象上,扩展原有对象的功能。
装饰者模式中包含四个角色:
- 被装饰者:可以是一个接口或抽象类,定义一些已有的功能;
- 被装饰者实现类:实现了被装饰者的具体功能;
- 装饰者:一个继承了被装饰者的抽象类,必须是个抽象类,而且类中必须含有被装饰者的引用;
- 装饰者子类:装饰者的子类,实现了被装饰者的方法。
下面以给视频增加评论为例:
创建IVideo接口:
public interface IVideo {
void play();
}
创建视频实现类:
public class Video implements IVideo {
@Override
public void play() {
System.out.println("播放视频");
}
}
创建业务类,播放视频:
public class Test {
public static void main(String[] args) {
IVideo video = new Video();
video.play();
}
}
播放视频
现在要为视频增加一个评论:
public abstract class VideoDecorator extends IVideo {
protected IVideo iVideo;
public VideoDecorator(IVideo iVideo) {
this.iVideo = iVideo;
}
}
public class Comment extends VideoDecorator {
public Comment(IVideo iVideo) {
super(iVideo);
}
@Override
public void play() {
iVideo.play();
System.out.println("增加一个评论");
}
}
在业务类上实现为视频增加两个评论:
public class Test {
public static void main(String[] args) {
IVideo video;
video = new Video();
video = new Comment(video);
video = new Comment(video);
video.play();
}
}
播放视频
增加一个评论
增加一个评论
装饰者模式适用于以下场景:
- 扩展一个类的功能;
- 动态给一个对象添加功能,还可以动态撤销
装饰者模式和代理模式
我们可以看出装饰者模式和代理模式有相似之处,其应用场景都包含扩展一个类的功能,但是二者区别如下:
- 装饰者模式侧重于动态地扩展一个类的功能,既能增强还能撤销,而代理模式侧重于控制对一个对象的访问并增强这个对象,无法撤销增强;