代理模式(Proxy Pattern)
定義:
爲其他對象提供一種代理以控制對這個對象的訪問。
顧名思義,代理不就是一般找人去做事情嗎,比如小時候找人打架,你不上,花錢僱人幫你幹仗,這就是代理,兩個有共同的目標,就是揍那個欺負你的人,就是兩個人具備同一個接口,花錢僱人,我不動手,打手動手。其實生活中處處都存在這種模式,文明一點的講,比如找律師打官司,定外賣。
好處:
在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
UML:
事例演示:
舉個例子吧,就比如現在的社會,拖欠農民工工資問題非常嚴重,王伯打算找個律師去幫他打官司來要回工錢。
那我們先定義一個接口IGetMoney,實現兩個方法,舉報黑心大老闆以及法庭辯護
public interface IGetMoney {
// 舉報
void report();
// 辯護
void advocacy();
}
那麼接下來,王伯出場,實現接口。
public class WangBo implements IGetMoney {
public void report() {
// 舉報黑心大老闆
System.out.println("老子要舉報這個黑心老闆,欠錢不還");
}
public void advocacy() {
// 法庭一通辯護
System.out.println("某年某月,在工地施工,最後,不給錢。。。。");
}
}
這年頭自己勢力小,請個律師吧,接下來律師登場。
public class Lawyer implements IGetMoney {
private IGetMoney iGetMoney;
public Lawyer(IGetMoney money) {
iGetMoney = money;
}
public void report() {
iGetMoney.report();
}
public void advocacy() {
iGetMoney.advocacy();
}
}
調用實現下。
public class Client {
public static void main(String[] args) {
WangBo wangbo=new WangBo();
Lawyer law=new Lawyer(wangbo);
law.report();
law.advocacy();
}
}
這單單是王伯一人,假如李伯,張伯,都請這個律師做代理,一對N,這樣的設計模式就方便了很多,寫出李伯,張伯類去實現接口,到時候直接調用就可以。其實說白了,代理模式主要還是使用了java的多態,交給別人去完成,但前提是知根知底,有共同的接口。