装饰器模式(Decorator Pattern)该如何使用在项目?
点击上方“JavaEdge”,关注公众号
在实际开发中,一般你会如何给一个类或对象新增行为呢?
继承
子类在拥有自身方法的同时还拥有父类方法。但这种方案是比较静态的,用户无法控制新增行为的方式和时机。
关联
将一个类的对象A嵌入另一个对象B,由另一个对象决定是否调用嵌入对象B的行为以便扩展自身行为,这个嵌入的对象B就叫做装饰器(Decorator)。
定义
角色
Component 接口
ConcreteComponent
Decorator
ConcreteDecorator
代码案例
public interface Window {
// 绘制窗口
public void draw();
// 返回窗口的描述
public String getDescription();
}
public class SimpleWindow implements Window {
public void draw() {
// 绘制窗口
}
public String getDescription() {
return "simple window";
}
}
public abstract class WindowDecorator implements Window {
// 被装饰的Window
protected Window decoratedWindow;
public WindowDecorator (Window decoratedWindow) {
this.decoratedWindow = decoratedWindow;
}
public void draw() {
decoratedWindow.draw();
}
public String getDescription() {
return decoratedWindow.getDescription();
}
}
public class VerticalScrollBar extends WindowDecorator {
public VerticalScrollBar(Window windowToBeDecorated) {
super(windowToBeDecorated);
}
public void draw() {
super.draw();
drawVerticalScrollBar();
}
private void drawVerticalScrollBar() {
// Draw the vertical scrollbar
}
public String getDescription() {
return super.getDescription() + ", including vertical scrollbars";
}
}
public class HorizontalScrollBar extends WindowDecorator {
public HorizontalScrollBar (Window windowToBeDecorated) {
super(windowToBeDecorated);
}
public void draw() {
super.draw();
drawHorizontalScrollBar();
}
private void drawHorizontalScrollBar() {
// Draw the horizontal scrollbar
}
public String getDescription() {
return super.getDescription() + ", including horizontal scrollbars";
}
}
优点
缺点
适用场景
系统存在大量独立扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
类定义不能继承(如final类)
扩展
透明装饰模式
要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型。半透明装饰模式
允许用户在客户端声明具体装饰者类型的对象,调用在具体装饰者中新增的方法。
往期推荐
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~
评论