代理模式(Proxy):提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。
换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的。当然,代理类与目标类要实现同一个接口。
优点:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需要修改,可以通过代理的方式来扩展该方法。
举个通俗易懂的例子来说明代理模式:假设我们打官司,打官司比较麻烦,需要取证,辩论等,这就需要专业的代理律师。此时,我们就可聘请“代理律师”来完成整个打官司的所有事务。当事人只需与代理律师签订了“全权委托协议”,那么整个打官司的过程,当事人均可不出现。
聘请代理律师时以下几点需要特别说明:
(1)当事人与代理律师是在为同一件事情努力。
(2)法院所有的具体事务都是通过代理律师完成。
(3)在法院需要当事人完成某些工作时,代理律师会通知当事人,并为其出谋划策,即增强当事人。
对于代理模式,需要注意以下几点:
(1)代理类和目标类要实现同一个接口,即业务接口。
(2)客户类对目标类的调用均是通过代理类完成的。
(3)代理类的执行既执行了对目标类的增强业务逻辑,又调用了目标类的主业务逻辑。
根据代理关系建立的时间不同,可以将代理分为两类:静态代理与动态代理。就好比当事人与律师之间的关系一样,也分为法律顾问与代理律师两类。
1.1 静态代理
静态代理是指:代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立。
静态代理类似于企业与企业的法律顾问间的关系。法律顾问与企业的代理关系,并不是在“官司”发生后才建立的,而是之前就确立好的一种关系。
代码实现与解析:
(1)定义业务接口
(2)定义目标类,该类实现了业务接口;该方法为目标方法
(3)定义代理类 。这个类要实现 业务接口。并且该代理类要将接口对象作为一个成员变量,还要定义一个无参构造器,这个参数为接口对象。目的是,将目标对象引入代理类,以便代理类调用目标类的目标方法
(4)测试该静态代理方法【如上,我们的目标类是返回abc,但是我们是想在不改变目标类的情况下让他返回ABC,就在代理类上做手脚,最后返回的是ABC】
1.2 动态代理
动态代理:程序在运行后,才建立的代理对象。
目标对象的代理对象只是由代理生成工具(如代理工厂类)在程序运行时由 JVM 根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确立。
动态代理类似于普通当事人与聘请的律师间的关系。律师是在“官司”发生后,才由当事人聘请的。即代理关系是在“官司”发生后才确立的。
动态代理有两种:JDK动态代理和CGLIB动态代理。