主動模式在大型服務(wù)系統(tǒng)中鲫尊,是完全必須的。在設(shè)計模式中沦偎,有個監(jiān)聽模式可以概括這種情況疫向,而不完全如此。在監(jiān)聽模式中豪嚎,往往需要先往目標(biāo)注冊搔驼,然后 根據(jù)目標(biāo)的狀態(tài)變化,由目標(biāo)通知監(jiān)聽者侈询。但在這里舌涨,監(jiān)聽者卻并不知道需要監(jiān)聽哪些東西。也就是說監(jiān)聽者和被監(jiān)聽者之間往往沒有固定和必然的聯(lián)系扔字。
我 們可以想象泼菌,當(dāng)一個人進入白骨荒野谍肤,這是個眼界很開闊的地圖,對于你的進入哗伯,已經(jīng)在白骨荒野的人應(yīng)該可以看到你的存在荒揣,而事實上,他們并不會向你注冊他是 否監(jiān)聽你焊刹,你也不需要監(jiān)聽他的存在系任。之所以我們舉這個例子,是因為白骨荒野比較大虐块。任何一個進入這個地區(qū)的人來說俩滥,他不可能知道所有在這個地區(qū)的人,注冊 就無從說起了贺奠。
這是個很矛盾的事情霜旧,因為對于你和一個你并不知道的人來說,你們兩個的關(guān)系并不是由你們自己決定的儡率,而是由你們同處于一個視野這個事實決定的挂据。因此我們需要一個管理器,負(fù)責(zé)模擬生成客觀世界需要生成的事實儿普,就像進入視野這種事情崎逃。我們在前面的討論過程,有個很重要的原則眉孩,就是減少關(guān)聯(lián)性个绍,比如N個實體之間,關(guān)聯(lián)性將為(N-1)^2浪汪,如果存在一個管理器巴柿,那么實體之間只有N個關(guān)聯(lián)。
我們假設(shè)白骨荒野有個事件管理器死遭,那么當(dāng)所有進入白骨荒野的人广恢,都會向管理器注冊,由管理器判斷并且產(chǎn)生事件殃姓。我感覺這個模式有些問題袁波,但還沒有仔細(xì)研究。從理論上來說蜗侈,應(yīng)該具有很好的優(yōu)點篷牌,很簡單,這種方式減少了關(guān)聯(lián)度踏幻,必然減少由此引起的計算量枷颊,可同樣會導(dǎo)致復(fù)雜度。
我們在前面討論過數(shù)據(jù)抽象的事情,試圖將所有的實體抽象并表格化夭苗,同時還會每個字段綁定一個函數(shù)信卡,這個函數(shù)可能會被外界驅(qū)動,比如客戶端的鍵盤操作题造。當(dāng)一個角色行走時傍菇,那么行走函數(shù)會被調(diào)用,新的坐標(biāo)可以通過這個函數(shù)通知給管理器界赔,這種方法讓我們在很高的實時性以及很小的粒度上獲取主動性丢习。
管理器的存在是個很麻煩的事情,因為他具備全局屬性淮悼,給我們試圖將所有局部化的理論帶來很大的顛覆咐低,同樣的,管理器為我們提供方便的主動模式袜腥。
考慮暴風(fēng)城和閃金鎮(zhèn)2個分區(qū)见擦,我們無法假設(shè)他們具備同一個管理器,因為這樣會導(dǎo)致我們必須假設(shè)西部荒野也使用這個管理器羹令,以致于整個世界都是用相同的管理器鲤屡。為了更變態(tài)一點,我們將白骨荒野切割成2個分區(qū)AB特恬,在分區(qū)的邊緣各站1個人P1/P2执俩,顯然徐钠,管理器模式無法解決這種情況癌刽,因為一個分區(qū)的管理器無法知道另外一個分區(qū)的信息。P1就站在P2面前尝丐,卻不知道P2在轉(zhuǎn)身显拜,顯然很荒謬。
這里有2個方案爹袁,方案1是讓分區(qū)管理器將某些事件向周圍進行廣播远荠,需要廣播哪些事件,由分區(qū)管理器決定失息,這個方案使得管理器是扁平的譬淳,但可能導(dǎo)致廣播風(fēng)暴。
方案2是在分區(qū)管理器之上盹兢,建立一個公共的父管理器邻梆,由父管理器負(fù)責(zé)決定向哪些分區(qū)發(fā)播哪些事件。這個方案可以降低事件廣播的量绎秒,但管理器就比較多浦妄,呈樹狀結(jié)構(gòu)。個人感覺方案2更具競爭力,可以更多架構(gòu)上的好處剂娄。