定义:Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供 一种代理以控制对这个对象的访问。)
如果没有代理模式时的代码:
先定义接口IGamePlayer
利用到代理模式:
代理模式的优点:
职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理 完成一件事务,附带的结果就是编程简洁清晰。
高扩展性 具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱 如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。
智能化 这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到 代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的。
代理模式的实际意义
我相信第一次接触到代理模式的读者肯定很郁闷,为什么要用代理呀?想想现实世界 吧,打官司为什么要找个律师?因为你不想参与中间过程的是是非非,只要完成自己的答辩 就成,其他的比如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。代理模 式的使用场景非常多,大家可以看看Spring AOP,这是一个非常典型的动态代理。
代理模式的扩展 --- 普通代理
在网络上代理服务器设置分为透明代理和普通代理,是什么意思呢?透明代理就是用户 不用设置代理服务器地址,就可以直接访问,也就是说代理服务器对用户来说是透明的,不 用知道它存在的;普通代理则是需要用户自己设置代理服务器的IP地址,用户必须知道代理 的存在。普通代理,它的要求就是客户端只能访问代理角色,而不能访问真实角色。
运行结果完全相同。在该模式下,调用者只知代理而不用知道真实的角色是谁,屏蔽了 真实角色的变更对高层模块的影响,真实的主题角色想怎么修改就怎么修改,对高层次的模 块没有任何的影响,只要你实现了接口所对应的方法,该模式非常适合对扩展性要求较高的 场合。
强制代理
如何理解强制代理:这就好比是你和一个明星比较熟,相互认 识,有件事情你需要向她确认一下,于是你就直接拨通了明星的电话: “喂,沙比呀,我要见一下×××导演,你帮下忙了!” “不行呀衰哥,我这几天很忙呀,你找我的经纪人吧……”
郁闷了吧,你是想直接绕过她的代理,谁知道返回的还是她的代理,这就是强制代理
直接访问真实用户,得到的答案
创建一个自己定义的代理对象,去访问
根据真实对象获取到他的代理对象,然后进行操作
动态代理:
什么是动态代理?动态代理是在实现阶段不用关心代理谁,而在运行阶段 才指定代理哪一个对象。相对来说,自己写代理类的方式就是静态代理。
// 动态代理需要进一步学习和体会
动态代理对接口中的每一个方法都实现了增强效果。
AOP编程没有使用什么新的技术,但是它对我们的设计、编码 有非常大的影响,对于日志、事务、权限等都可以在系统设计阶段不用考虑,而在设计后通 过AOP的方式切过去。
IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(cl,player.getClass().getInterfaces(),new GamePlayIH(player));
该方法是重新生成了一个对象,为什么要重新生成?你要使用代理呀,注意 c.getInterfaces()这句话,这是非常有意思的一句话,是说查找到该类的所有接口,然后实现 接口的所有方法。当然了,方法都是空的,由谁具体负责接管呢?是new MyInvocationHandler(_Obj)这个对象。于是我们知道一个类的动态代理类是这样的一个类, 由InvocationHandler的实现类实现所有的方法,由其invoke方法接管所有方法的实现