以对客户端透明的方式(包装器和被包装的类实现统一接口)、通过排列组合的方式 为已有对象添加新的功能或增强又有功能。
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// 透明,面向抽象编程 c-->ConcreteDecorator1-->ConcreteDecorator2
Component c = new ConcreteComponent();
Component wrapper1 = new ConcreteDecorator1(c);
Component wrapper2 = new ConcreteDecorator2(wrapper1);
System.out.println(wrapper2.fun("xxxxx"));
// 或者任意组合 c-->ConcreteDecorator2-->ConcreteDecorator1
Component wrapper11 = new ConcreteDecorator2(c);
Component wrapper22 = new ConcreteDecorator1(wrapper11);
System.out.println(wrapper22.fun("yyyyy"));
// 半透明,面向具体编程
ConcreteDecorator1 wrapper111 = new ConcreteDecorator1(c);
ConcreteDecorator2 wrapper222 = new ConcreteDecorator2(wrapper111);
System.out.println(wrapper222.fun("zzzzz"));
}
}
interface Component {
String fun(String str);
}
// 具体构件类
// 如果只有一个具体构件类,则下面的抽象包装器可以直接继承自该具体构件类
class ConcreteComponent implements Component {
public String fun(String str) {
return "原始数据: '" + str + "'";
}
}
abstract class AbstractDecorator implements Component {
protected Component c;
public AbstractDecorator(Component c) {
this.c = c;
}
public abstract String fun(String str) ;
}
class ConcreteDecorator1 extends AbstractDecorator {
public ConcreteDecorator1 (Component c) {
super(c);
}
public String fun(String str) {
return "ConcreteDecorator1 包装了:[ " + c.fun(str) + "]";
}
}
class ConcreteDecorator2 extends AbstractDecorator {
public ConcreteDecorator2 (Component c) {
super(c);
}
public String fun(String str) {
return "ConcreteDecorator2 包装了:[ " + c.fun(str) + "]";
}
}
运行结果:
ConcreteDecorator2 包装了:[ ConcreteDecorator1 包装了:[ 原始数据: 'xxxxx']]
ConcreteDecorator1 包装了:[ ConcreteDecorator2 包装了:[ 原始数据: 'yyyyy']]
ConcreteDecorator2 包装了:[ ConcreteDecorator1 包装了:[ 原始数据: 'zzzzz']]