首页 > 代码库 > 设计模式(二)学习----动态代理

设计模式(二)学习----动态代理

动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象。Spring AOP采用的核心思想就是动态代理设计模式。

 下面看动态代理的UML类图:

   

下面思考问题:invocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的?

动态代理类:

package com.lp.ecjtu.DynamicProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 动态代理类,代理玩游戏练级的代练者 * @author Administrator * */public class GamePlayerhandler implements InvocationHandler{    //被代理对象,也就是目标对象    private Object target;    public GamePlayerhandler(Object realObject){        this.target = realObject;    }    /**     * 在目标对象的方法前面执行的业务员逻辑     */    public void beforeMethod(){        System.out.println("***********业务逻辑before************");    }    /**     * 在目标对象的执行的方法后执行的业务逻辑     */    public void afterMehod(){        System.out.println("************业务逻辑after************");    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        beforeMethod();        //执行目标对象的方法,也就是反射后真实类中的方法        Object result = method.invoke(target, args);        //为了防止盗号,如果想让游戏登陆后发个信息给我们,直接修改GamePlayerServiceImp?        //不是好方法,可以在这个方法里面修改        //被代理对象的方法名称等于login        if(method.getName().equalsIgnoreCase("login")){            System.out.println("有人在用你的账号登陆,请确认是否是本人!");        }        afterMehod();        return result;    }}

目标类对象接口:(被代理类):

package com.lp.ecjtu.DynamicProxy;/** * 目标对象实现的接口,用JDK来生成代理对象一定要实现一个接口  * @author Administrator * */public interface IGamePlayerService {    //代理对象将实现目标对象接口下面的所有方法    //登陆游戏    public void login(String user,String password);    //杀怪    public void killBoss();    //升级    public void upgrade();}

 

目标实现类:

package com.lp.ecjtu.DynamicProxy;/** *  * @author Administrator * 目标类,被代理的对象类 */public class GamePlayerServiceImp implements IGamePlayerService{    private String playerName;    public GamePlayerServiceImp(){            }    public GamePlayerServiceImp(String playerName){        this.playerName = playerName;    }    @Override    public void killBoss() {        System.out.println("正在打怪中---------");    }    @Override    public void login(String user, String password) {        System.out.println("    陆游戏----------");    }        @Override    public void upgrade() {        System.out.println("打怪升级中--------");    }}

游戏客户端:

package com.lp.ecjtu.DynamicProxy;import java.lang.reflect.Proxy;public class GameClient {    /**     * @param args     */    public static void main(String[] args) {        //被代理对象的实例化,也可以说成目标对象的实例化        IGamePlayerService realPlayer = new GamePlayerServiceImp("代练者张三");        //实例化一个handler        GamePlayerhandler handler = new GamePlayerhandler(realPlayer);        //获得类的ClassLoader        ClassLoader classloader = realPlayer.getClass().getClassLoader();        //代理对象实现目标对象的接口,还可以使用new Class[]{IGamePlayerService.class}        Class<?>[] interfaces = realPlayer.getClass().getInterfaces();        //根据目标对象动态的生成一个代理者        IGamePlayerService proxy = (IGamePlayerService) Proxy.newProxyInstance(                classloader,                 interfaces,                 handler);        //代练者登陆        proxy.login("张三", "123");        //打怪        proxy.killBoss();        //升级        proxy.upgrade();    }}