package zhuang_shi_mo_shi;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
Animal jerry = new Rat();
jerry = new DecorateAnimal(jerry, FlyFeature.class);
jerry = new DecorateAnimal(jerry, DigFeature.class);
jerry.doStuff();
}
}
interface Animal {
public void doStuff();
}
class Rat implements Animal {
@Override
public void doStuff() {
System.out.println("Jerry will paly with Tom");
}
}
// //////////////////////////////////////////////////////////////////////
interface Feature {
public void laod();
}
class FlyFeature implements Feature {
@Override
public void laod() {
System.out.println("增加一對翅膀");
}
}
class DigFeature implements Feature {
@Override
public void laod() {
System.out.println("增加鑽地能力");
};
}
class DecorateAnimal implements Animal {
private Animal animal;
private Class<? extends Feature> clazz;
public DecorateAnimal(Animal animal, Class<? extends Feature> clazz) {
this.animal = animal;
this.clazz = clazz;
}
@Override
public void doStuff() {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
if (Modifier.isPublic(method.getModifiers())) {
obj = method.invoke(clazz.newInstance(), args);
}
animal.doStuff();
return obj;
}
};
ClassLoader classLoader = getClass().getClassLoader();
Feature proxy = (Feature) Proxy.newProxyInstance(classLoader, clazz.getInterfaces(), handler);
proxy.laod();
}
}