package pac.testin;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Person {
void showCommonAbility();
}
class Man implements Person {
private String name;
public Man(String name) {
super();
this.name = name;
}
public void showCommonAbility() {
System.out.println("My name is " + this.name
+ "!!I can do everything you can!!");
}
}
interface AbilityDecorator {
void decorate();
}
class Ability_SolidSkin implements AbilityDecorator {
public void decorate() {
System.out.println("[Solid Skin]");
}
}
class Ability_LightSpeed implements AbilityDecorator {
public void decorate() {
System.out.println("[Light Speed]");
}
}
class Fighter implements Person {
public Fighter(Person person, Class<? extends AbilityDecorator> ability) {
super();
this.person = person;
this.ability = ability;
}
private Person person;
private Class<? extends AbilityDecorator> ability;
public void showCommonAbility() {
InvocationHandler handler = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.print("Research Complete:");
method.invoke(ability.newInstance(), args);
person.showCommonAbility();
return null;
}
};
AbilityDecorator fighter = (AbilityDecorator) Proxy.newProxyInstance(
getClass().getClassLoader(), ability.getInterfaces(), handler);
fighter.decorate();
}
}
public class DynamicDecorator {
public static void main(String[] args) {
Person introspector = new Man("King.");
introspector = new Fighter(introspector, Ability_SolidSkin.class);
introspector = new Fighter(introspector, Ability_LightSpeed.class);
introspector.showCommonAbility();
}
}