簡體中文 | 繁體中文

大話設計模式-----第85章


圍城:一樹梨花壓海棠 楚武獨尊 翡翠手 從高中那年開始:異能情侶 何處覓安生 冷顏殺手 總裁,我們結婚吧 挪威的森林 最強前妻:狼性少尊請住手 極品尤物軍團 閃婚厚愛:boss的二嫁甜妻 仙念 麒麟劍 炮灰公主要逆 賊道 無盡拳 來自陰間的快遞 exo:情人未滿i 愛不惜:相親相來的帥老公 戴珍珠耳環的少女
第85章

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

推薦小說