什麼是代理模式呢?我很忙,忙的沒空理你,那你要找我呢就先找我的代理人吧,那代理人總要知道
被代理人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,代理人雖然不能幹活,但是被
代理的人能幹活呀。
比如西門慶找潘金蓮,那潘金蓮不好意思答覆呀,咋辦,找那個王婆做代理,表現在程序上時這樣的:
先定義一種類型的女人:
package com.alex.patterns.proxy;
/**
* @author Alex
* 定義一種類型的女人,王婆和潘金蓮都屬於這個類型的女人
*/
public interface KindWomen {
// 這種類型的女人能做什麼事情呢?
public void makeEyesWithMan(); // 拋媚眼
public void happyWithMan(); // happy what? You know that!
}
一種類型嘛,那肯定是接口,然後定義潘金蓮:
package com.alex.patterns.proxy;
/**
* @author Alex
* 定一個潘金蓮是什麼樣的人
*/
public class PanJinLian implements KindWomen {
public void happyWithMan() {
System.out.println("潘金蓮在和男人做那個.....");
}
public void makeEyesWithMan() {
System.out.println("潘金蓮拋媚眼");
}
}
再定一個醜陋的王婆:
package com.alex.patterns.proxy;
/**
* @author Alex
* 王婆這個人老聰明瞭,她太老了,是個男人都看不上, 但是她有智慧有經驗呀,她作爲一類女人的代理!
*/
public class WangPo implements KindWomen {
private KindWomen kindWomen;
public WangPo() { // 默認的話,是潘金蓮的代理
this.kindWomen = new PanJinLian();
}
// 她可以是KindWomen的任何一個女人的代理,只要你是這一類型
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
public void happyWithMan() {
this.kindWomen.happyWithMan(); // 自己老了,幹不了,可以讓年輕的代替
}
public void makeEyesWithMan() {
this.kindWomen.makeEyesWithMan(); // 王婆這麼大年齡了,誰看她拋媚眼?!
}
}
兩個女主角都上場了,男主角也該出現了:
package com.alex.patterns.proxy;
/**
* @author Alex
* 定義一個西門慶,這人色中餓鬼
*/
public class XiMenQing {
/*
* 水滸裏是這樣寫的:西門慶被潘金蓮用竹竿敲了一下難道,癡迷了, 被王婆看到了, 就開始撮合兩人好事,王婆作爲潘金蓮的代理人
* 收了不少好處費,那我們假設一下: 如果沒有王婆在中間牽線,這兩個不要臉的能成嗎?難說的很!
*/
public static void main(String[] args) {
// 把王婆叫出來
WangPo wangPo = new WangPo();
// 然後西門慶就說,我要和潘金蓮happy,然後王婆就安排了西門慶丟筷子的那齣戲:
wangPo.makeEyesWithMan(); // 看到沒,雖然表面上時王婆在做,實際上爽的是潘金蓮
wangPo.happyWithMan();
}
}
那這就是活生生的一個例子,通過代理人實現了某種目的,如果真去掉王婆這個中間環節,直接是西
門慶和潘金蓮勾搭,估計很難成就武松殺嫂事件。
那我們再考慮一下,水滸裏還有沒有這類型的女人?有,盧俊義的老婆賈氏(就是和那個固管家苟合
的那個) ,這名字起的: “假使” ,那我們也讓王婆做她的代理:
把賈氏素描出來:
package com.alex.patterns.proxy;
/**
* @author Alex
*/
public class JiaShi implements KindWomen {
public void happyWithMan() {
System.out.println("賈氏正在Happy中......");
}
public void makeEyesWithMan() {
System.out.println("賈氏拋媚眼");
}
}
西門慶勾賈氏:
package com.alex.patterns.proxy;
/**
* @author Alex
* 定義一個西門慶,這人色中餓鬼
*/
public class XiMenQing {
public static void main(String[] args) {
// 改編一下歷史,賈氏被西門慶勾走:
JiaShi jiaShi = new JiaShi();
WangPo wangPo = new WangPo(jiaShi); // 讓王婆作爲賈氏的代理人
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
說完這個故事,那額總結一下,代理模式主要使用了 Java 的多態,幹活的是被代理類,代理類主要是
接活,你讓我幹活,好,我交給幕後的類去幹,你滿意就成,那怎麼知道被代理類能不能幹呢?同根就成,
大家知根知底,你能做啥,我能做啥都清楚的很,同一個接口唄。
注:本文參考PDF《您的設計模式》