常用Java设计模式系列(3)- 代理模式

来源:互联网 发布:乐高编程机器人难不难 编辑:程序博客网 时间:2024/06/10 15:45

在这篇文章中,我们来讲第三个比较常用的设计模式,那就是代理模式。


什么是代理模式呢?

我们首先给出比较官方的说明,在<Java与模式>一书中是这样写道的:

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。


我想着还是比较容易理解的。简而言之,代理模式就是在需要服务的对象和提供服务的对象之间提供一个媒介的作用。有时候,在服务提供方和服务需求方之间,因为各种各样的原因可能并不想他们直接接触,这时候,就可以引入代理模式,对服务提供方提供一个代理对象,让代理对象和服务需求方之间进行对接。现实中,老板的秘书我们可以简单的认为就是一种代理模式,老板和下面的员工之间的工作安排都是通过秘书来进行传达的。


在代理模式中,涉及到三个角色:

抽象对象角色:声明真实目标对象和代理对象的共同接口(或者说对外提供的方法),这样原来需要调用真实目标角色的客户角色就可以直接使用代理对象来进行访问了;

真实目标对象角色:真实提供服务的对象,由其提供最终的具有实际意义的各种行为操作;

代理对象角色:包含对真实目标对象角色的引用,从而保证客户角色在访问代理对象角色时请求的操作可以最终转换为真实目标对象角色的行为。


下面我们通过简单的Java代码示例来说明。

抽象对象角色:

package com.majing.test.designpattern.proxy;public abstract class AbstractObject {protected abstract void operation();}

真实目标对象角色:

package com.majing.test.designpattern.proxy;public class RealObject extends AbstractObject {@Overrideprotected void operation() {System.out.println("真实目标对象进行了相关的业务行为操作!");}}

代理对象角色:

package com.majing.test.designpattern.proxy;public class ProxyRealObject extends AbstractObject{private AbstractObject realObject;public ProxyRealObject(AbstractObject realObject){this.realObject = realObject;}@Overrideprotected void operation() {System.out.println("代理对象中进行真实目标操作operation()方法前的预处理!");realObject.operation();System.out.println("代理对象中进行真实目标操作operation()方法后的后处理!");}}

测试主程序:

package com.majing.test.designpattern.proxy;public class Client {public static void main(String[] args) {System.out.println("直接调用真实目标对象角色执行目标行为:");AbstractObject realObject = new RealObject();realObject.operation();System.out.println("-----------------------------------");System.out.println("通过代理对象执行目标行为:");AbstractObject realObject2 = new ProxyRealObject(realObject);realObject2.operation();}}

运行上面的代码,可以得到下面的结果:

从上面我们可以看到,不管是直接调用真实对象角色,还是通过代理对象,最终执行的都还是真实目标对象角色。代理模式只是为了将服务需求者和服务提供者进行了隔离,起到一个中间人的作用。在代理模式中,我们还可以根据实际的需要在调用真实对象角色行为前进行必要的其他操作处理。


代理模式是使用比较频繁的一种设计模式,广泛使用于各种场合。按照职责来划分,通常有以下几种场景:1、远程代理。2、虚拟代理。3、Copy-on-Write 代理。4、保护(Protect or Access)代理。5、Cache代理。6、防火墙(Firewall)代理。7、同步化(Synchronization)代理。8、智能引用(Smart Reference)代理。关于上面这些代理的具体实现还需要大家自行研究,这篇文章只是对代理模式的整体思路进行简单的说明。


至此,关于单例模式的相关说明已经全部讲述完毕,如果想了解我最新的博文,请关注我的博客,谢谢。如果您愿意打赏我,可扫描下方二维码,对您的打赏我表示感谢。吐舌头


0 0