装饰模式定义:动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。
UML 图(略)
/**
* 被装饰者接口
*/
public interface Composite {
public void methodA();
public void methodB();
}
/**
* 被装饰对象
*/
public class ContreteComposite implements Composite {
@Override
public void methodA() {
System.out.println("ContreteDecorator methodA");
}
@Override
public void methodB() {
System.out.println("ContreteDecorator methodB");
}
}
/**
* 具体装饰者1
*/
public class ConcreteDecorator1 implements Composite {
private Composite composite;
public ConcreteDecorator1(Composite composite) {
this.composite = composite;
}
@Override
public void methodA() {
//这里实现装饰功能
System.out.println("ConcreteDecorator1 methodA");
//这里调用被装饰者的原来功能
composite.methodA();
}
@Override
public void methodB() {
//这里实现装饰功能
System.out.println("ConcreteDecorator1 methodB");
//这里调用被装饰者的原来功能
composite.methodB();
}
}
/**
* 具体装饰者2
*/
public class ConcreteDecorator2 implements Composite {
private Composite composite;
public ConcreteDecorator2(Composite composite) {
this.composite = composite;
}
@Override
public void methodA() {
//这里实现装饰功能
System.out.println("ConcreteDecorator2 methodA");
//这里调用被装饰者的原来功能
composite.methodA();
}
@Override
public void methodB() {
//这里实现装饰功能
System.out.println("ConcreteDecorator2 methodB");
//这里调用被装饰者的原来功能
composite.methodB();
}
}
/**
* 装饰者模式的使用
*/
public class TestDecorator {
/**
* @param args
*/
public static void main(String[] args) {
Composite composite = new ConcreteDecorator2(new ConcreteDecorator1(new ContreteComposite()));
composite.methodA();
composite.methodB();
}
}