结构图
模式说明
类设计
模式说明
- 扩展点在具体的ConcreteDecorator,若增加一个新的Decorator类,无需改动整个结构。
- 客户端需要知道具体哪个Component实现类,以及每一个Decorator的实现类。
- 客户端可以定制Decorator的执行顺序。
- 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵活。
public static void main(String[] args) {
Component component = new ConcreteComponent();
Decorator da = new ConcreteDecoratorA();
// pass primitive component to decoratorA
da.setComponent(component);
Decorator db = new ConcreteDecoratorB();
// pass decoratorB to decoratorA
db.setComponent(da);
// set the decoration work
db.operation();
}
类设计
public interface Component {
public void operation();
}
public class Decorator implements Component {
private Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if (component != null) {
component.operation();
}
}
}
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("component operation");
}
}
public class ConcreteDecoratorA extends Decorator {
private String addedState;
@Override
public void operation() {
super.operation();
addedState = "Running";
System.out.println("addedState:" + addedState + " in decorator A.");
}
}
public class ConcreteDecoratorB extends Decorator {
@Override
public void operation() {
super.operation();
addedBehavior();
}
private void addedBehavior() {
System.out.println("addedBehavior in decorator B.");
}
}