设计模式之代理模式
Posted zbb2161228
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之代理模式相关的知识,希望对你有一定的参考价值。
学习过Spring AOP后,对其实现的原理有了基本的了解,明白其核心是动态代理机制,通过匿名内部类方法对条件进行拦截,达到了切面编程的效果。
那么,怎么去解释代理模式呢?
这里仅简单介绍一下对动态模式的理解。
借用《设计模式之禅》一书对代理模式的介绍,以网络游戏的打怪升级为例。一路上的打怪升级总是必不可少的,但伴随着玩家的也有枯燥、重复的操作,降低了游戏的趣味。这时游戏代练便出场了,把账号交给代练人员操作,由他们帮助我们升级打怪,看到自己经验不断上涨的同时还不用自己动手,岂不是美滋滋~~
可是,事情远没这么简单。当我们自己拥有该账号的时候,一般不会担心账号风险问题。但是一旦把账号交给了代练,就会增加许多不确定因素,比如账号信息泄露、非代理登录盗号等等,那这时,通过动态代理,在登录这个操作后,给我们发送一条登录回执,这样在登录后进行确认,就大大降低了对账号的担忧~~
伪代码如下
首先定义一个游戏客户端:
public class Client { public static void main(String[] args) { //定义玩家 GamePlayer gamePlayer = new GamePlayer("aaa"); //定义一个handeler InvocationHandler handler = new GamePlayerProxy(gamePlayer); //获得类的ClassLoader ClassLoader cl = gamePlayer.getClass().getClassLoader(); //动态产生代理者 GamePlayer proxy = (GamePlayer) Proxy.newProxyInstance(cl,new Class[]{GamePlayer.class},handler); //登录,开始游戏 proxy.login("username","password"); proxy.play(); proxy.upgrade(); proxy.logout(); //记录结束时间 System.out.println("Game shutdown at " + System.currentTimeMillis()); } }
这是正常的游戏操作,那如何实现登录回执呢?
public class GamePlayerProxy implements InvocationHandler { //被代理者 Class cls = null; //被代理的实例 Object obj = null; //我代理谁 public GamePlayerProxy(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().equals("login")){ System.out.println("The account is now log in where ip=xxx"); } return result; } }
这样,一个简单的动态代理就实现了,这实际也是AOP的切面编程思想,在主要开发阶段,不对日志、权限进行考量,在后期使用AOP进行切面编程,大大简化了产品设计~~
个人OS:代理模式应该算是最简单的设计模式了。。。
以上是关于设计模式之代理模式的主要内容,如果未能解决你的问题,请参考以下文章