第85章(1 / 1)

大话设计模式 吴强 951 字 2个月前

大B:“再举个通俗的例子,你想找某局长帮你做一件事情,但局长官位显赫,你又不能轻易见着,你就想到了找他的秘书,通过她传话给局长,这样你就等于请他的秘书帮你办成了那件事。秘书为什么就可以找到局长呢,因为秘书和局长之间有一定的关系。这里产生了四个对象:你、秘书、局长、秘书-局长(关系)。J**A中同样有代理关系,我们叫做代理模式。”

小A:“代理模式有什么作用呢?”

大B:“他能为其他对象(局长)提供一种代理(秘书)以控制对这个对象(局长)的访问。代理对象可以在客户端(你)和目标对象(局长)之间起到中介的作用。”

小A:“代理模式都有些什么角色?”

大B:“1、抽象角色(秘书-局长):声明真实对象和代理对象的共同接口(秘书-局长)。2、代理角色(秘书):代理对象角色(秘书)内部含有对真实对象(局长)的引用,从而可以操作真实对象(局长),同时代理对象(秘书)提供与真实对象(局长)相同的接口(秘书-局长)以便在任何时刻都能代替真实对象(局长)。同时,代理对象(秘书)可以在执行真实对象(局长)操作时,附加其他的操作,相当于对真实对象(局长)进行封装。3、真实角色(局长):代理角色(秘书)所代表的真实对象(局长),是我们最终要引用的对象(局长)。”

下面用四个代码来是这个原理:

Client.java(你)、ProxySubject.java(秘书)、RealSubject.java(局长)、Subject.java(关系)

(1)Subject.java(关系)

package.pjwqh.proxyTest;

//抽象角色

abstractpublicclassSubject

{

abstractpublicvoidrequest();

}

(2)RealSubject.java(局长)

package.pjwqh.proxyTest;

//真实角色:实现了Subject的request()方法

publicclassRealSubjectextendsSubject

{

publicRealSubject()

{

}

publicvoidrequest()

{

System.out.println(“我是局长,哈哈”);

}

}

(3)ProxySubject.java(秘书)

package.pjwqh.proxyTest;

//代理角色

publicclassProxySubjectextendsSubject

{

privateRealSubjectrealSubject;//以真实角色作为代理角色的属性

publicProxySubject()

{

}

publicvoidrequest()//该方法封装了真实对象的request方法

{

preRequest();

if(realSubject……null)

{

realSubject=newRealSubject();

}

realSubject.request();//此处执行真实对象的request方法

postRequest();

}

privatevoidpreRequest()

{

//somethingyouwanttodobeforerequesting

}

privatevoidpostRequest()

{

//somethingyouwanttodoafterrequesting

}

}

4)Client.java(你)

package.pjwqh.proxyTest;

//客户端调用

publicclassClient

{

publicstaticvoidmain(String[]args)

{

//你直接找(秘书)

Subjectsub=newProxySubject();

sub.request();

}

}

运行输出了“我是局长,哈哈”

大B:“这说明我们通过代理对象(秘书)成功调用了被代理对象(局长)的方法。由代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。”