大B:“再舉個通俗的例子,你想找某局長幫你做一件事情,但局長官位顯赫,你又不能輕易見著,你就想到了找他的秘書,通過她傳話給局長,這樣你就等於請他的秘書幫你辦成了那件事。秘書為什麼就可以找到局長呢,因為秘書和局長之間有一定的關係。這裏產生了四個對象:你、秘書、局長、秘書-局長(關係)。JAVA中同樣有代理關係,我們叫做代理模式。”
小A:“代理模式有什麼作用呢?”
大B:“他能為其他對象(局長)提供一種代理(秘書)以控製對這個對象(局長)的訪問。代理對象可以在客戶端(你)和目標對象(局長)之間起到中介的作用。”
小A:“代理模式都有些什麼角色?”
大B:“1、抽象角色(秘書-局長):聲明真實對象和代理對象的共同接口(秘書-局長)。2、代理角色(秘書):代理對象角色(秘書)內部含有對真實對象(局長)的引用,從而可以操作真實對象(局長),同時代理對象(秘書)提供與真實對象(局長)相同的接口(秘書-局長)以便在任何時刻都能代替真實對象(局長)。同時,代理對象(秘書)可以在執行真實對象(局長)操作時,附加其他的操作,相當於對真實對象(局長)進行封裝。3、真實角色(局長):代理角色(秘書)所代表的真實對象(局長),是我們最終要引用的對象(局長)。”
下麵用四個代碼來是這個原理:
(1)(關係)
//抽象角色
//真實角色:實現了Subject的request方法
(“我是局長,哈哈”);
//代理角色
privateRealSubjectrealSubject;//以真實角色作為代理角色的屬性
publicvoidrequest//該方法封裝了真實對象的request方法
;//此處執行真實對象的request方法
//客戶端調用
//你直接找(秘書)
運行輸出了“我是局長,哈哈”
大B:“這說明我們通過代理對象(秘書)成功調用了被代理對象(局長)的方法。由代碼可以看出,客戶實際需要調用的是RealSubject類的request方法,現在用ProxySubject來代理RealSubject類,同樣達到目的,同時還封裝了其他方法(preRequest,postRequest),可以處理一些其他問題。”
(本章完)