装饰器模式结构:
Component:抽象构件
ConcreteComponent:具体构件
Decorator:抽象装饰类
ConcreteDecorator:具体装饰类
UML图:
例子代码:
抽象构件
public interface Component {
void operation1();
void operation2();
}
具体构件
public class ConcreteComponent implements Component {
@Override
public void operation1() {
System.out.println("被装饰者自带方法一");
}
@Override
public void operation2() {
System.out.println("被装饰者自带方法二");
}
}
抽象装饰类
public abstract class Decorator implements Component{
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation1(){
component.operation1();
}
@Override
public void operation2() {
component.operation2();
}
}
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
public void addBehavior1(){
System.out.println("装饰器A装饰方法一");
}
public void addBehavior2(){
System.out.println("装饰器A装饰方法二");
}
@Override
public void operation1() {
super.operation1();
addBehavior1();
}
@Override
public void operation2() {
super.operation2();
addBehavior2();
}
}
public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void addBehavior1(){ System.out.println("装饰器B装饰方法一"); } public void addBehavior2(){ System.out.println("装饰器B装饰方法二"); } @Override public void operation1() { super.operation1(); addBehavior1(); } @Override public void operation2() { super.operation2(); addBehavior2(); } }
客户端public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); Decorator decorator = new ConcreteDecoratorA(new ConcreteDecoratorB(component)); decorator.operation1(); decorator.operation2(); } }
结果打印: