首页 > 代码库 > 设计模式(二)学习----动态代理
设计模式(二)学习----动态代理
动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象。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(); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。