先看一个例子,是有关于打游戏杀怪兽的。
//先定义一个游戏者接口 public interface IGamePlayer { //登陆游戏 public void login(String user, String password); //杀怪,网络游戏的主要角色 public void killBoss(); //升级 public void upgrade(); } //游戏者 public class GamePlayer implements IGamePlayer { private String name = ""; //通过构造方法传递名称 public GamePlayer(String _name) { this.name = _name; } //打怪,最期望的就是打怪 @Override public void killBoss() { System.out.println(this.name + "在打怪!"); } //在游戏之前肯定要登录吧 @Override public void login(String user, String password) { System.out.println("登陆名" + user + "的用户" + this.name + "登陆成功"); } //升级,升级有很多方法,花钱买是一种,做任务又是一种 @Override public void upgrade() { System.out.println(this.name + "又升了一级"); } } //场景类 public class Client { public static void main(String[] args) { //定义一个痴迷的玩家 IGamePlayer player = new GamePlayer("张三"); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); player.login("zhangsan", "password"); //开始杀怪 player.killBoss(); //升级 player.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//增加一个GamePlayerProxy来代表游戏代练者,它也不能有作弊的方法呀,游戏代练者也是手动打怪呀,因此需要同样继承IGamePlayer接口,代码如下: public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; //通过构造方法传递要对谁进行代练 public GamePlayerProxy(IGamePlayer _gamePlayer) { this.gamePlayer = _gamePlayer; } //代练杀怪 @Override public void killBoss() { this.gamePlayer.killBoss(); } //代练登录 @Override public void login(String user, String password) { this.gameplayer.login(user, password); } //升级 @Override public void upgrade() { this.gamePlayer.upgrade(); } }
public class Client { public static void main(String[] args) { //定义一个痴迷的玩家 IGamePlayer player = new GamePlayer("张三"); //然后再定义一个代练者 IGamePlayer proxy = new GamePlayerProxy(player); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); proxy.login("zhangsan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//抽象主题类,可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。 public interface Subject { //定义一个方法 public void request(); } //具体主题角色类,也叫被委托的角色、被代理的角色,它才是最重要的,是业务逻辑的具体执行者。 public class RealSubject implements Subject { @Override public void request() { //业务逻辑处理 } } //代理类 public class Proxy implements Subject { //要代理哪个实现类 private Subject subject = null; //默认被代理者 public Proxy() { this.subject = new Proxy(); } //通过构造方法传递代理者 public Proxy(Object...objects) { } //实现接口中的方法 @Overrdie public void request() { this.before(); this.subject.request(); this.after(); } //预处理 private void before() { //do something } //善后处理 private void after() { //do something } }
//普通代理的游戏者 public class GamePlayer implements IGamePlayer { private String name = ""; //通过构造方法限制谁能创建对象,并同时传递姓名(在构造方法中,传递一个IGamePlayer对象,检查谁能创建真实的角色,当然还可以有其他的限制,比如类名必须是Proxy类等等,我们可以根据实际情况进行扩展) public GamePlayer(IGamePlayer _gamePlayer, String _name) { if(_gamePlayer == null) { throw new Exception("不能创建真实角色"); } else { this.name = _name; } } //打怪,最期望的就是打怪 @Override public void killBoss() { System.out.println(this.name + "在打怪!"); } //在游戏之前肯定要登录吧 @Override public void login(String user, String password) { System.out.println("登陆名" + user + "的用户" + this.name + "登陆成功"); } //升级,升级有很多方法,花钱买是一种,做任务又是一种 @Override public void upgrade() { System.out.println(this.name + "又升了一级"); } } //普通代理的代理者,仅仅修改了构造方法,传递一个代理者的名称,即可代理,在这种情况下,系统更加简洁了,调用者只知道代理存在就可以了,不需要知道代理了谁. public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; //通过构造方法传递要对谁进行代练 public GamePlayerProxy(String name) { try { gamePlayer = new GamePlayer(this, name); } catch (Exception e) { } } //代练杀怪 @Override public void killBoss() { this.gamePlayer.killBoss(); } //代练登录 @Override public void login(String user, String password) { this.gameplayer.login(user, password); } //升级 @Override public void upgrade() { this.gamePlayer.upgrade(); } } //普通代理的场景类 public class Client { public static void main(String[] args) { //然后再定义一个代练者 IGamePlayer proxy = new GamePlayerProxy("张三"); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); proxy.login("zhangsan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//修改后的IGamePlayer //先定义一个游戏者接口 public interface IGamePlayer { //登陆游戏 public void login(String user, String password); //杀怪,网络游戏的主要角色 public void killBoss(); //升级 public void upgrade(); //每个人都可以找一个自己的代理 public IGamePlayer getProxy(); } //强制代理的真实角色 public class GamePlayer implements IGamePlayer { private String name = ""; //我的代理是谁 private IGamePlayer proxy = null; //通过构造方法传递名称 public GamePlayer(String _name) { this.name = _name; } //找到自己代理 @Override public IGamePlayer getProxy() { this.proxy = new GamePlayerProxy(this); return this.proxy; } //打怪,最期望的就是打怪 @Override public void killBoss() { if (this.isProxy()) { System.out.println(this.name + "在打怪!"); } else { System.out.println("请使用制定的代理访问"); } } //在游戏之前肯定要登录吧 @Override public void login(String user, String password) { if (this.isProxy()) { System.out.println("登陆名" + user + "的用户" + this.name + "登陆成功"); } else { System.out.println("请使用制定的代理访问"); } } //升级,升级有很多方法,花钱买是一种,做任务又是一种 @Override public void upgrade() { if (this.isProxy()) { System.out.println(this.name + "又升了一级"); } else { System.out.println("请使用制定的代理访问"); } } //检验是否是代理访问 private boolean isProxy() { if (this.proxy == null) { return false; } else { return true; } } }
public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; //通过构造方法传递要对谁进行代练 public GamePlayerProxy(IGamePlayer _gamePlayer) { this.gamePlayer = _gamePlayer; } //代练杀怪 @Override public void killBoss() { this.gamePlayer.killBoss(); } //代练登录 @Override public void login(String user, String password) { this.gameplayer.login(user, password); } //升级 @Override public void upgrade() { this.gamePlayer.upgrade(); } //代理的代理暂时没有,就是我自己 @Override public IGamePlayer getProxy() { return this; } }
//直接访问真实角色 public class Client { public static void main(String[] args) { //然后再定义一个游戏角色 IGamePlayer player = new GamePlayer("张三"); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); player.login("zhangsan", "password"); //开始杀怪 player.killBoss(); //升级 player.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//直接访问代理类 public class Client { public static void main(String[] args) { //然后再定义一个游戏角色 IGamePlayer player = new GamePlayer("张三"); //然后在定义一个代练者 IGamePlayer proxy = new GamePlayerProxy(player); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); proxy.login("zhangsan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//强制代理的场景类 public class Client { public static void main(String[] args) { //然后再定义一个游戏角色 IGamePlayer player = new GamePlayer("张三"); //获取制定的代理 IGamePlayer proxy = plyer.getProxy(); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); proxy.login("zhangsan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//代理类的接口 public interface IProxy { //计算费用 public void count(); } //代理类 public class GamePlayerProxy implements IGamePlayer,IProxy { private IGamePlayer gamePlayer = null; //通过构造方法传递要对谁进行代练 public GamePlayerProxy(IGamePlayer _gamePlayer) { this.gamePlayer = _gamePlayer; } //代练杀怪 @Override public void killBoss() { this.gamePlayer.killBoss(); } //代练登录 @Override public void login(String user, String password) { this.gameplayer.login(user, password); } //升级 @Override public void upgrade() { this.gamePlayer.upgrade(); this.count(); } //计算费用 @Override public void count() { System.out.println("升级费用是:150元") } }
//虚拟代理类 public class Proxy implements Subject { //要代理哪个实现类 private Subject subject; //实现接口定义方法 @Override public void request() { //判断一下真实主题是否初始化 if (subject == null) { subj = new RealSubject(); } subject.request(); } }
//动态代理类 public class GamePlayIH implements InvocationHandler { //被代理者 Class cls = null; //被代理的实例 Object obj = null; //我要代理谁 public GamePlayIH(Object _obj) { this.obj = _obj; } //调用被代理的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(this.obj, args); return result; } }
//动态代理的场景类 public class Client { public static void main(String[] args) { //定义一个痴迷的玩家 IGamePlayer player = new GamePlayer("张三"); //定义一个handler InvocationHandler handler = new GamePlayIH(player); //开始打游戏,记录下时间 System.out.println("开始时间是:2013-10-12 21:51"); //获得类的class loader ClassLoader loader = player.getCLass().getClassLoader(); //动态产生一个代理者 IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(loader, new Class[]{IGamePlayer.class}, handler); proxy.login("zhangsan", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是:2013-10-13 21:51"); } }
//修正后的动态代理类 public class GamePlayIH implements InvocationHandler { //被代理者 Class cls = null; //被代理的实例 Object obj = null; //我要代理谁 public GamePlayIH(Object _obj) { this.obj = _obj; } //调用被代理的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(this.obj, args); if (method.getName().equalsIgnoreCase("login")) { System.out.println("有人在用我的账号"); } return result; } }
//抽象主题类,可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。 public interface Subject { //定义一个方法 public void doSomething(); } //具体主题角色类,也叫被委托的角色、被代理的角色,它才是最重要的,是业务逻辑的具体执行者。 public class RealSubject implements Subject { @Override public void doSomething() { //业务逻辑处理 } } //动态代理的Handler public class MyInvocationHandler implements InvocationHandler { //被代理的实例 private Object obj = null; //我要代理谁 public MyInvocationHandler(Object _obj) { this.obj = _obj; } //调用被代理的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(this.obj, args); } } //动态代理类 public class DynamicProxy<T> { public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) { //寻找JoinPoint连接点,AOP框架使用元数据定义 if (true) {//一个判断条件 //执行一个前置通知 (new BeforeAdvice()).exec(); } //执行目标,并返回结果 return (T)Proxy.newProxyInstance(loader, interfaces, handler); } } //通知接口及实现 public interface IAdvice { //通知只有一个房,执行即可 public void exec(); } public class BeforeAdvice implements IAdvice { @Override public void exec() { System.out.println("我是前置通知,我被执行了"); } }
public class Client { public static void main(String[] args) { //定义一个主题 Subject subject = new RealSubject(); //定义一个Handler InvocationHandler handler = new MyInvocationHandler(subject); //定义主题的代理 Subject proxy = DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), handler); //代理行为 proxy.doSomething(); } }
//具体业务的动态代理 public class SubjectDynamicProxy extends DynamicProxy { public static <T> T newProxyInstance(Subject subject) { //获得ClassLoader ClassLoader loader = subject.getClass().getClassLoader(); //获得接口数组 Class<?> classes = subject.getClass().getInterfaces(); //获得handler InvocationHandler handler = new MyInvocationHandler(subject); return super.newProxyInstance(loader, classes, handler); } }
public class Client { public static void main(String[] args) { //定义一个主题 Subject subject = new RealSubject(); Subject proxy = SubjectDynamicProxy.newProxyInstance(subject); //代理行为 proxy.doSomething(); } }