1、目标装饰的类
interface SmallAnimal {
void doStuff();
}
class Rat implements SmallAnimal {
public void doStuff() {
System.out.println("Rat doStuff");
}
}
2、需要添加的装饰类
interface Feature {
void load();
}
class FlyFeature implements Feature {
public void load() {
System.out.println("FlyFeature load");
}
}
class DigFeature implements Feature {
public void load() {
System.out.println("DigFeature load");
}
}
3、装饰类
class DecorateSmallAnimal implements SmallAnimal {
private SmallAnimal animal;
private Class<? extends Feature> clz;
public DecorateSmallAnimal(SmallAnimal animal, Class<? extends Feature> clz) {
this.animal = animal;
this.clz = clz;
}
public void doStuff() {
Feature proxy = (Feature) Proxy.newProxyInstance(getClass()
.getClassLoader(), clz.getInterfaces(),
new InvocationHandler() {
public Object invoke(Object o, Method m, Object[] args)
throws Throwable {
Object returnObj = m.invoke(clz.newInstance(), args);
animal.doStuff();
return returnObj;
}
});
proxy.load();
}
}
4、使用
SmallAnimal jetty = new Rat();
jetty = new DecorateSmallAnimal(jetty, FlyFeature.class);
jetty = new DecorateSmallAnimal(jetty, DigFeature.class);
jetty.doStuff();
5、结果
DigFeature load
FlyFeature load
Rat doStuff