【Java 设计模式系列】装饰器模式 (Decorator Pattern)
=================================================================
Component 接口: 抽象构件
定义了对象的接口,可以给这些对象动态增加功能
ConcreteComponent 具体类: 具体构件
定义了具体的构件对象,实现了 在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)
Decorator 抽象类: 装饰类
抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具 体职责在其子类中实现;
ConcreteDecorator 具体类: 具体装饰类
具体装饰类是抽象装饰类的子类,负责向构 件添加新的职责。
===================================================================
窗口 接口
public interface Window {
// 绘制窗口
public void draw();
// 返回窗口的描述
public String getDescription();
}
无滚动条功能的简单窗口实现
public class SimpleWindow implements Window {
@Override
public void draw() {
// 绘制窗口
}
@Override
public String getDescription() {
return "simple window";
}
}
以下类包含所有 Window 类的 decorator,以及修饰类本身。
// 抽象装饰类 注意实现 Window 接口
public abstract class WindowDecorator implements Window {
// 被装饰的 Window
protected Window decoratedWindow;
public WindowDecorator (Window decoratedWindow) {
this.decoratedWindow = decoratedWindow;
}
@Override
public void draw() {
decoratedWindow.draw();
}
@Override
public String getDescription() {
return decoratedWindow.getDescription();
}
}
// 第一个具体装饰器 添加垂直滚动条功能
public class VerticalScrollBar extends WindowDecorator {
public VerticalScrollBar(Window windowToBeDecorated) {
super(windowToBeDecorated);
}
@Override
public void draw() {
super.draw();
drawVerticalScrollBar();
}
private void drawVerticalScrollBar() {
// Draw the vertical scrollbar
}
@Override
public String getDescription() {
return super.getDescription() + ", including vertical scrollbars";
}
}
// 第二个具体装饰器 添加水平滚动条功能
public class HorizontalScrollBar extends WindowDecorator {
public HorizontalScrollBar (Window windowToBeDecorated) {
super(windowToBeDecorated);
}
@Override
public void draw() {
super.draw();
drawHorizontalScrollBar();
}
private void drawHorizontalScrollBar() {
// Draw the horizontal scrollbar
}
@Override
public String getDescription() {
return super.getDescription() + ", including horizontal scrollbars";
}
}
![](https://img-blog.csdnimg.cn/ad240de49e644ef18589efa03b2b94ec.png?
x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw,size_16,color_FFFFFF,t_70)
=================================================================
使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
与继承相比,关联关系的优势在于不破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。
评论