定義:
由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標對象,代理對象作為訪問對象和目標對象之間的中介。
通俗理解:
現實生活中需要找一個中介幫忙完成某項任務,這個中介就是代理對象。
例如:買火車票不一定要去火車站買,可以通過12306網站或者去售票點購買。
優點:
1、代理模式在客戶端與目標對象之間起到一個中介作用和保護目標對象的作用。
2、代理對象可以擴展目標對象的功能。
3、代理模式能將客戶端與目標對象分離,在一定程度上降低了系統的耦合度,增加了程序的可擴展性。
缺點:
1、代理模式會造成系統設計中類的數量增加。
2、在客戶端和目標對象之間增加一個代理對象,會造成請求處理速度變慢。
3、增加了系統的復雜度。
使用動態代理可以解決以上缺點。
代理模式結構:
1、抽象主題類: 通過接口或者抽象類聲明真實主題和代理對象實現的業務方法。
2、真實主題類: 實現類抽象主題中的具體業務,是代理對象所代表的真實對象,是最終要引用的對象。
3、代理類: 提供了與真實主題相同的接口,其內部含有對真實主題的引用,它可以訪問、控制或擴展真實主題的功能。
代碼實現場景:
西門慶想找潘金蓮,潘金蓮不好意思答復,就找了王婆做代理。
上代碼:
public interface KindWomen {
public void makeEyesWithMan();
public void hAppyWithMan();
}
public class PanJinLian implements KindWomen{
@Override
public void makeEyesWithMan() {
System.out.println("潘金蓮拋媚眼");
}
@Override
public void happyWithMan() {
System.out.println("潘金蓮在和男人做那個.....");
}
}
public class WangPo implements KindWomen{
private KindWomen kindWomen;
public WangPo() {
this.kindWomen = new PanJinLian();
}
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
this.kindWomen.happyWithMan();
}
}
public class XiMenQing {
public static void main(String[] args) {
WangPo wangPo = new WangPo();
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
注:本文創作思路源于《設計模式之禪》