大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()),可以處理一些其他問題。”