定义
Decorator Pattern: 动态地给一个对象增加一些额外地职责,就增加对象功能来说,装饰模式比生成子类实现更灵活。装饰模式是一种对象结构型模式。
UML示例
代码示例
// 抽象构件类
abstract class Component {
public abstract void display();
}
// 窗体类 具体构件类
public class Window extends Component{
public void display() {
System.out.println("显示窗体");
}
}
// 文本框类:具体构件类
public class TextBox extends Component{
public void display() {
System.out.println("显示文本框");
}
}
// 列表框类 具体构件
public class ListBox extends Component{
public void display() {
System.out.println("显示列表框");
}
}
// 构件装饰类 抽象装饰类
public class ComponentDecorator extends Component{
private Component component;
public ComponentDecorator(Component component){
this.component = component;
}
public void display(){
component.display();
}
}
// 滚动条装饰类 具体装饰类
public class ScrollBarDecorator extends ComponentDecorator{
public ScrollBarDecorator(Component component) {
super(component);
}
public void display() {
super.display();
setScrollBar();
}
public void setScrollBar(){
System.out.println("为构件添加滚动条");
}
}
// 黑色边框装饰类
public class BlackBorderDecorator extends ComponentDecorator{
public BlackBorderDecorator(Component component) {
super(component);
}
public void display() {
super.display();
setBlackBorder();
}
public void setBlackBorder(){
System.out.println("为构件添加黑色边框");
}
}
public class Client {
public static void main(String[] args) {
// 添加抽象构件定义
Component component, componentSB, comSBB;
// 定义具体构件
component = new Window();
componentSB = new ScrollBarDecorator(component);
componentSB.display();
// 装饰类不仅可以注入具体构件类
// 装饰类还可以注入具体装饰类获得拓展!
// 这是它与桥接模式不同地方之一
comSBB = new BlackBorderDecorator(componentSB);
comSBB.display();
}
}
客户端输出
显示窗体
为构件添加滚动条
显示窗体
为构件添加滚动条
为构件添加黑色边框