1、代理模式是什么
代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下:
Provide a surrogate or placeholder for another object to control access to it.
(为其他对象提供一种代理以控制对这个对象的访问。)
2、代理模式的三类角色
<1> 抽象主题角色Subject :
通过接口或者抽象类定义真实角色的业务方法
(实现不同,接口相同)
<2> 具体主题角色RealSubject : 实现抽象角色,实现具体的业务逻辑,供代理
角色调用。(冤大头)
<3> 代理主题角色ProxySubject : 是真实角色的代理,通过调用真实角色的业务方法,并附加自己的操作。(前置增强、后置增强、环绕增强)
(具体的让冤大头做,我稍微改改就是我的了)
3、代理模式的分类
静态代理:由程序员创建生成代理类的源码,再编译代理类,所谓静态也就是在程序运行前就已经存在代理类的字节码文件。
动态代理:在实现阶段不用关心代理类,而是在运行阶段才指定哪一个代理对象
静态代理
1、静态代理的简单实现
代理模式的核心在代理类上(eg:有增强处理)
代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活, 好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口。
我们可以尝试写一个小例子来感受静态代理的:
首先我们要有一个统一的接口,大家知根知底
我们要有一个老实人给我们写核心机密(让他为我们做我们不会的内容)
学生自己改了改报告
老师来检查了
控制台给老师展示我们的报告
2、静态代理的总结
在通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个实现类由高层模块来决定,也就是在代理类的构造函数中传递被代理者。
你要代理谁就产生该代理的实例,然后把被代理者传入进来。
3、代理模式的优点
- 职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。 - 高扩展性
具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。 - 智能化
这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的。