装饰器模式结构:
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(); } }
结果打印: