设计模式:装饰模式
什么是装饰模式
一种动态地为一个类中添加新行为的设计模式。
装饰模式的结构是怎样的
装饰模式的结构图:
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();
}
}
(完)