【CODE】Decoration Pattern中动态选择装饰方案

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();

    }

}

 

你可能感兴趣的:(Pattern)