實用的設(shè)計模式-雙分派模式

雙向分派模式-java版實現(xiàn)

原創(chuàng)?一個man?一個man?今天

先聊聊動態(tài)綁定和靜態(tài)綁定

動態(tài)綁定

動態(tài)綁定是指程序在運行期判斷引用的對象實際類型,根據(jù)實際的類型調(diào)用其相對應(yīng)的方法窍箍。

public?class?DynamicBinding?{

public?static?void?main(String[]?args) {

Animal?dog?=?new?Dog();

Animal?cat?=?new?Cat();

dog.talk();

cat.talk();

? }

}

class?Animal{

public?void?talk(){}

}

class?Dog?extends?Animal{

public?void?talk(){System.out.println("dog talk...汪汪");}

}

class?Cat?extends?Animal{

public?void?talk(){System.out.println("cat talk...喵喵");}

}

靜態(tài)綁定

靜態(tài)綁定是在編譯期就已經(jīng)確認了執(zhí)行那個方法豪硅,方法重載(方法名相同參數(shù)列表不同)就是靜態(tài)綁定香璃,重載時執(zhí)行哪一個方法在編譯期就已經(jīng)確定了。

public?class?DynamicBinding?{

public?static?void?main(String[]?args) {

OutputName?out?=?new?OutputName();

Person?p?=?new?Person();

Person?man?=?new?Man();

Person?woman?=?new?Woman();

out.print(p);

out.print(man);

out.print(woman);

? }

}

class?Person?{

}

class?Man?extends?Person?{

}

class?Woman?extends?Person?{

}

class?OutputName?{

void?print(Person?p) {

System.out.println("person");

? }

void?print(Man?m) {

System.out.println("man");

? }

void?print(Woman?w) {

System.out.println("woman");

? }

}

不管傳入的對象實際是什么類型都會執(zhí)行print(Person p)這個方法舟误,所以重載是靜態(tài)綁定葡秒。

如果希望使用重載的時候,程序能夠根據(jù)傳入?yún)?shù)的實際類型動態(tài)地調(diào)用相應(yīng)的方法嵌溢,只能通過instanceof操作符進行類型的判斷眯牧,然后再進行調(diào)用。雖然可以解決問題赖草,但是如果子類數(shù)目很多学少,那么就要寫很過個if else來判斷類型,顯然不是這種解決方案不是很合適秧骑。

雙分派

分派( dispatch)是指運行環(huán)境按照對象的實際類型為其綁定對應(yīng)方法體的過程版确。

double dispatch(雙分派)在選擇一個方法的時候,不僅僅要根據(jù)消息接收者(receiver) 的運行時型別(Run time type)乎折,還要根據(jù)參數(shù)的運行時型別(Run time type)绒疗。這里的消息接收者其實就是方法的調(diào)用者。具體來講就是骂澄,對于消息表達式a.m(b)吓蘑,雙分派能夠按照a和b的實際類型為其綁定對應(yīng)方法體。

public?class?DynamicBinding?{

public?static?void?main(String[]?args) {

Father?father?=?new?Father();

Father?s1?=?new?Son1();

Father?s2?=?new?Son2();

Execute?exe?=?new?Execute();

father.accept(exe);

s1.accept(exe);

s2.accept(exe);

? }

}

class?Father?{

public?void?accept(Execute?exe) {

exe.method(this);

? }

}

class?Son1?extends?Father?{

@Override

public?void?accept(Execute?exe) {

exe.method(this);

? }

}

class?Son2?extends?Father?{

@Override

public?void?accept(Execute?exe) {

exe.method(this);

? }

}

class?Execute?{

public?void?method(Father?father) {

System.out.println("This is Father's method");

? }

public?void?method(Son1?son) {

System.out.println("This is Son1's method");

? }

public?void?method(Son2?son) {

System.out.println("This is Son2's method");

? }

}

雙分派模式下,無形中沒有了繁瑣的if磨镶。溃蔫。else,在面向?qū)ο蟮乃枷胂铝彰ǎ绦蜃兊酶拥睦谕卣埂?/p>


寫到最后

過程式代碼難以添加新的數(shù)據(jù)結(jié)構(gòu)伟叛,因為如果要添加新的數(shù)據(jù)結(jié)構(gòu)就必須要修改所有函數(shù);面向?qū)ο蟠a難以添加新的函數(shù)脐嫂,因為如果要添加新的函數(shù)就必須修改所有的類痪伦。

[代碼簡潔之道]??第六章-對象和數(shù)據(jù)結(jié)構(gòu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雹锣,隨后出現(xiàn)的幾起案子网沾,更是在濱河造成了極大的恐慌,老刑警劉巖蕊爵,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辉哥,死亡現(xiàn)場離奇詭異,居然都是意外死亡攒射,警方通過查閱死者的電腦和手機醋旦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会放,“玉大人饲齐,你說我怎么就攤上這事∵肿睿” “怎么了捂人?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矢沿。 經(jīng)常有香客問我滥搭,道長,這世上最難降的妖魔是什么捣鲸? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任瑟匆,我火速辦了婚禮,結(jié)果婚禮上栽惶,老公的妹妹穿的比我還像新娘愁溜。我一直安慰自己,他們只是感情好外厂,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布冕象。 她就那樣靜靜地躺著,像睡著了一般酣衷。 火紅的嫁衣襯著肌膚如雪交惯。 梳的紋絲不亂的頭發(fā)上次泽,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天穿仪,我揣著相機與錄音席爽,去河邊找鬼。 笑死啊片,一個胖子當著我的面吹牛只锻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紫谷,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼齐饮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笤昨?” 一聲冷哼從身側(cè)響起祖驱,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞒窒,沒想到半個月后捺僻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡崇裁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年匕坯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔稳。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡葛峻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巴比,到底是詐尸還是另有隱情术奖,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布轻绞,位于F島的核電站腰耙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铲球。R本人自食惡果不足惜挺庞,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稼病。 院中可真熱鬧选侨,春花似錦、人聲如沸然走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芍瑞。三九已至晨仑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洪己。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工妥凳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人答捕。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓逝钥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拱镐。 傳聞我的和親對象是個殘疾皇子艘款,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355