什么是装饰模式

一种动态地为一个类中添加新行为的设计模式。

装饰模式的结构是怎样的

装饰模式的结构图:

Component是一个抽象构件类。具体构件类(ConcretComponent)和抽象装饰类(Decorator)都继承自这个类。具体构件类实现了构件的基本行为。抽像装饰类持有一个抽象构件对象(component),并实现抽象构件中的operation()方法。在该方法中调用所持有对象component的operation()方法。具体装饰类(ConcreteDecorator)继承自抽象装饰类并实现operation()方法。具体装饰类中添加了新增的行为(addedBehavior())。在operation()中调用父类的operation()并调用本类中的新增行为方法。

客户端编程时:

Component concretComponent = new ConcretComponent();
Component decorator = new ConcreteDecorator(ConcretComponent);
decorator.display();//在原来行为上拥有了新增行为

一个装饰模式的实例

要设计一组可视化组件(Component),组件有列表框(ListBox)和文本框(TextBox)等基础组件。这些基础组件可以有相同的装饰行为。如都可以滚动(ScrollBar)。

实例代码

Component

public abstract class Component {
    abstract void display();
}

ListBox

public class ListBox extends Component {
    @Override
    void display() {
        System.out.println("ListBox.display()");
    }
}

ComponentDecorator

public class ComponentDecorator extends Component {

    private Component component;
    public ComponentDecorator(Component component){
        this.component = component;
    }

    @Override
    void display() {
        component.display();
    }
}

ScrollBarDecorator

public class ScrollBarDecorator extends ComponentDecorator {
    public ScrollBarDecorator(Component component) {
        super(component);
    }

    public void display(){
        super.display();
        this.addScrollBar();
    }

    public void addScrollBar(){
        System.out.println("ScrollBar Support");
    }
}

Client

public class Client {
    public static void main(String[] args){
        Component box = new ListBox();
        Component scrollBar = new ScrollBarDecorator(box);

        scrollBar.display();
    }
}

(完)