标签:bsp 扩展性 切面 关系 逻辑 抽象 调用 情况下 动态
代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问
代理模式也叫做委托模式, 它是一项基本设计技巧. 许多其他的模式, 如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式, 而且在日常的应用中, 代理模式可以提供非常好的访问控制.
代理模式的通用类图如下:
图中三个角色的定义:
Proxy 代码为:
这样就实现了一个简单的代理
代理模式的优点:
代理模式的使用场景:
为什么要用代理模式呢?就比如打官司, 为什么要找个律师? 因为你不想参与中间过程的是是非非, 只要完成自己的答辩就成, 其他的事前调查、事后追查等都由律师来搞定, 这就是为了减轻你的负担
1.普通代理模式
普通代理就是我们要知道代理的存在, 也就是 Proxy 这个类的存在,然后才能访问,普通代理模式下的Proxy类代码:
在这种改造下, 系统更加简洁了, 调用者只知道代理的存在就可以,不用知道代理了谁. 屏蔽了真实角色的变更对高层模块的影响, 真实的角色想怎么修改就怎么修改,对高层次的模块没有任何的影响, 只要你实现了接口所对应的方法,该模式非常适合对扩展性要求极高的场合.
2.强制代理
强制代理就是调用者直接调用真是角色, 而不用关心代理是否存在,其代理的产生是由真实角色决定的, 也就是说强制代理不管你是通过代理类还是通过直接new一个角色类, 都不能访问, 只有通过真是角色指定的代理类才可以访问, 也就是说真实对象管理代理角色. 这么说, 高层模块new了一个真实角色的对象, 返回的却是代理角色.
修改后的代码如下:
代理类如下:
真实类如下:
这样通过使用 new RealSubject().getProxy(); 就可以通过真实角色找到代理了
强制代理的概念就是要从真实角色查找到代理角色. 高层模块只要调用getProxy就可以访问真实角色的所有方法, 代理的管理已经由真实角色自己完成
3.个性代理类
代理类也可以实现其他接口,实现其他方法,当然也可以代理多个真实角色,并且真实角色之间可以有耦合关系.
4.动态代理
什么是动态代理?动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象.
动态代理需要实现 InvocationHandler 接口:
通过 InvocationHandler 接口,所有的方法都被它接管了, 我们在使用的时候只需这样创建代理类:
这样, subject就是代理后的类
面向切面编程,即AOP, 其核心就是采用了动态代理机制
注意: 要实现动态代理的首要条件是, 被代理类必须实现了一个接口
代理模式应用的非常广泛,大到一个系统框架、企业平台,小到代码片段、事务处理,稍不留意就用到代理模式.
可以关注一下鄙人的公众号, 谢谢各位了!
标签:bsp 扩展性 切面 关系 逻辑 抽象 调用 情况下 动态
原文地址:https://www.cnblogs.com/hujingnb/p/10171550.html