概念:
代理模式,也有人稱為委託代理模式。代理模式是軟體設計模式中的一項基本技巧。
在代理模式中,有兩個物件參與處理同一個請求,接受請求的物件將請求委託給另一個物件來處理。
代理模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了代理模式。
委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin。
概念:
代理模式,也有人稱為委託代理模式。代理模式是軟體設計模式中的一項基本技巧。
在代理模式中,有兩個物件參與處理同一個請求,接受請求的物件將請求委託給另一個物件來處理。
代理模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了代理模式。
委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin。
角色:
抽象角色:聲明真實物件和代理物件的共同介面;
代理角色:代理物件角色內部含有對真實物件的引用,從而可以操作真實物件,同時代理物件提供與真實物件相同的介面以便在任何時刻都能代替真實物件。
同時,代理物件可以在執行真實物件操作時,附加其他的操作,相當於對真實物件進行封裝。
步驟:
(①②步比較菜,忽略。有異議者聯繫!)
①首先還是介面。將要代理的所有東西(這裡舉的例子是鞋子)的介面。
②定義某某公司,繼承介面。
③定義代理人,繼承介面。
/**
* @author wonter
* <b>描述:</b>就比如我要做這個代理商,我就要繼承賣鞋子這個介面(XieZ)。<br>
* <b>郵件:</b> yiyu1@163.com <br>
*/
public class Wonter implements XieZ {
private XieZ xiezi;
//你可以預設做愛迪達的代理
public wonter(){
this.xiezi = new adidas();
}
//也可以是XieZ中的任何一家公司的代理,只要你是這一類型
//這裡類型是XieZ介面,但傳入的則是“實現”介面的公司。
public Wonter(XieZ gongsi){
this.xiezi = gongsi;
}
public void bsktb() {
this.xiezi.bsktb(); //我只是代理,替公司賣鞋子
}
public void ftb() {
this.xiezi.ftb(); //我只是代理,替公司賣鞋子
}
}
④最後到了定義買家的時候了。
/**
* @author wonter
* <b>描述:</b>定義買家 <br>
* <b>郵件:</b> yiyu1@163.com <br>
*/
public class MaiJia {
public static void main(String[] args) {
//找到我代理的店鋪
Wonter wonter = new Wonter();
//在我這選擇你喜歡的鞋子。
//注意的是,雖然表面上是我在鞋子,但實際上卻是某某公司在賣鞋子。
wonter.bsktb();
wonter.ftb(); }
}
}
例如:此時又有一家公司(nike)找我做代理。相同的是:nike公司也是繼承了XieZ這個介面。
它也擁有XieZ介面中的所有功能。(或者還有XieZ介面中沒有的功能,nike公司獨有的功能)
這下我該怎麼辦呢?
/**
* @author wonter
* <b>描述:</b>此時又有一家公司(nike)找我做代理。 <br>
* <b>郵件:</b> yiyu1@163.com <br>
*/
public class MaiJia {
public static void main(String[] args) {
//做代理,也要先找到合適的公司吧。首先選定公司。
Nike nike = new Nike();
//詳見wonter.java中
//wonter繼承XieZ介面,傳入nike公司,改寫wonter方法。
//這樣,我就nike公司的所有鞋子,成了nike公司的代理人了。
Wonter wonter = new Wonter(nike);
//在我這選擇你喜歡的鞋子。
wonter.bsktb();
wonter.ftb();
}
}
好處:
代理模式的作用是:為其他物件提供一種代理以控制對這個物件的訪問。
在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在用戶端和目標物件之間起到仲介的作用。
/**
* @author wonter
* <b>描述:</b> 一天學一個模式 更新中,請關注我的weibo! <br>
* <b>微博:</b>:http://weibo.com/wontter
<br>
* <b>郵件:</b> yiyu1@163.com <br>
*/