孫悟空最終還是沒有能逃脫如來的手掌心,因緣注定,皈依佛門,雖沒有了做[齊天大圣](http://blog.csdn.net/u010850027/article/details/26497063)是的逍遙快活,也沒有大鬧天宮時的轟轟烈烈,但是現在有了更重要的一項任務,那就是普度眾生,《?西游記》第五十七回,說是“六耳獼猴”化作孫悟空的摸樣,傷了唐僧,后又和孫悟空大打出手。。。這位假孫悟空,實力不用多說了吧,和真孫悟空一般無二,大戰孫悟空,鬧到上天入地下海。在唐僧那:念緊箍咒,兩個都喊疼,自然看不出哪個真假;到天宮:拖塔天王拿照妖鏡照,也看不出;又到觀音那:觀音也看不出;最后到幽冥處閻羅那:經“諦聽”聽過之后,“諦聽”卻說:“我看出來了,卻不敢說”,最后還是如來老佛爺道出六耳真身并用金缽盂罩住,才被孫悟空一棍子打死。這是整個故事,看似很簡單,很完整,不過,我發現一個天大的伏筆。
那就是,真假美猴王的故事和我們設計模式中的職責鏈模式有著異曲同工之妙,在面向對象程式設計里, 職責鏈模式是一種軟件設計模式,它包含了一些命令對象和一系列的處理對象。每一個處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。官方定義---使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系,將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理她為止。來看一下職責鏈模式的結構圖:
? ? ??
在我們的實際生活中,我們也時常與職責鏈模式打著交道,比如類似“斗地主”這樣的游戲中,小北出牌給他的下家,下家看看手中的牌,如果要不起上家的牌則將出牌請求再轉發給他的下家,其下家再進行判斷。一個循環下來,如果其他人都要不起該牌,則小北可以打出新的牌。在這個過程中,牌作為一個請求沿著一條鏈在傳遞,每一位紙牌的玩家都可以處理該請求。以我們上述真假美猴王的故事為例,看看我們的代碼實現:
~~~
using?System;??
using?System.Collections.Generic;??
using?System.Linq;??
using?System.Text;??
using?System.Threading.Tasks;??
??
namespace?ConsoleApplication1??
{??
????class?Program??
????{??
????????static?void?Main(string[]?args)??
????????{??
??????????????
????????????{??
????????????????TangSeng?=?new?TangSeng("唐僧");??
????????????????LiTianWang?=?new?LiTianWang("李天王");??
????????????????GuangYin?=?new?GuangYin("觀音菩薩");??
????????????????DiTing?=?new?DiTing("諦聽");??
????????????????RuLai?=?new?RuLai("如來");???
??????????????}??
??
????????????//唐僧-->托塔李天王-->觀音菩薩-->閻羅殿諦聽-->如來佛祖??
????????????judgement.TangSeng.NextImmortal?=?judgement.LiTianWang;??
????????????judgement.LiTianWang.NextImmortal?=?judgement.GuanYin;??
????????????judgement.TangSeng.NextImmortal?=?judgement.DiTing;??
????????????judgement.DiTing.NextImmortal?=?judgement.RuLai;??
??
????????????//兩美猴王入場??
????????????string?SunWuKong?=?"SunWuKong",??
????????????SixEarMonkey?=?"SixEarMonkey";??
????????????//開始判斷真假美猴王??
????????????TheRealMonkeyKing?RealMonkeyKing?=?judgement.Judge(SunWuKong,?SixEarMonkey);??
????????????Console.WriteLine();??
????????????Console.WriteLine("Then,真正的美猴王是:"?+?RealMonkeyKing?+?"孫悟空");??
?????????????
????????????Console.ReadKey();??
????????}??
????}??
??
????//管理者,也就是眾多神仙們??
????abstract?class?Immortal??
????{??
????????protected?string?name;??
????????//神仙的上級,這里的級別并沒有嚴格的等級制度之分,只是因為該級別身份的神仙沒有辨別出真假孫悟空??
????????protected?Immortal?superior;??
????????public?Immortal?(string?name?)??
????????{??
????????????this.name?=?name;??
????????}??
????????//設置神仙的上級,這里的級別并沒有嚴格的等級制度之分,只是因為該級別身份的神仙沒有辨別出真假孫悟空??
????????public?void?SetSuperior(Immortal?superior)??
????????{??
????????????this.superior?=?superior;??
????????}??
??????????
????????//申請請求??
????????abstract?public?void?RequestApplication(Request?request);??
??????????
????}??
????//接下來,具體的神仙判斷,首先是唐僧??
????//唐僧??
????public?class?TangSeng?:?Immortal???
????{??
??
????????///?唐僧判斷真假美猴王??
??
????????public?TheRealMonkeyKing?Handler(string?SunWukong,?string?SixEarMonkey)??
????????{??
????????????Console.WriteLine("?唐僧念《緊箍兒咒》,二人一齊叫苦,?唐僧也不認得真假,兩悟空打到李天王哪里");??
????????????return?NextImmortal.Immortal(SunWukong,?SixEarMonkey);??
????????}??
??
????????//?指定下一路神仙??來判斷真假美猴王??
????????public?Immortal??NextImmortal?{?get;?set;?}??
??
????}??
??
????//托塔李天王??
????public?class?LiTianWang?:?Immortal??
????{??
??
????????//李天王判斷真假美猴王??
??
????????public?TheRealMonkeyKing?Immortal(string?SunWukong,?string?SixEarMonkey)??
????????{??
????????????Console.WriteLine("?李天王取照妖鏡照住,鏡中乃是兩個孫悟空,毫發不差。玉帝亦辨不出,兩悟空大戰幾百回合,來到了觀音那里");??
????????????return?NextImmortal.Immortal(SunWukong,?SixEarMonkey);??
????????}??
??
????????//?指定下一路神仙??來判斷真假美猴王??
????????public?Immortal?NextImmortal?{?get;?set;?}??
??
????}??
??
????//觀音??
????public?class?Guanyin?:?Immortal???
????{??
??
????????//觀音判斷真假美猴王??
??
????????public?TheRealMonkeyKing?Immortal(string?SunWukong,?string?SixEarMonkey)??
????????{??
????????????Console.WriteLine("?觀音念《緊箍兒咒》,二人一齊叫苦,?唐僧也不認得真假,兩悟空打到閻羅殿,諦聽出來辨別");??
????????????return?NextImmortal.Immortal(SunWukong,?SixEarMonkey);??
????????}??
??
????????//?指定下一路神仙來判斷真假美猴王??
??
????????public?Immortal??NextImmotal?{?get;?set;?}??
??
????}??
??
????//諦聽??
????public?class?DiTing?:Immortal???
????{??
??
????????//?諦聽判斷真假美猴王??
??
????????public?TheRealMonkeyKing?Immortal(string?SunWukong,?string?SixEarMonkey)??
????????{??
????????????Console.WriteLine("閻羅殿的諦聽可以分辨的出真假,?卻不敢說出來,因為六耳獼猴的后臺很強:如來是也");??
????????????return?NextImmortal.Immortal(SunWukong,?SixEarMonkey);??
????????}??
??
????????//?指定下一路神仙??來判斷真假美猴王??
??
????????public?IHandler?NextHandler?{?get;?set;?}??
????}??
??
????//如來??
?????public?class?RuLai?:Immortal???
????{??
???????
????????//?如來判斷真假美猴王??
??????
????????public?TheRealMonkeyKing?Immortal(string?SunWukong,?string?SixEarMonkey)??
????????{??
????????????Console.WriteLine("?如來佛辨出真假,是所有神仙都沒有聽說過的新物種:六耳獼猴");??
????????????
????????????return?TheRealMonkeyKing.SunWukong;??
????????????
????????}??
}??
~~~
對于真假美猴王這塊的內容,大家爭論不一,在真假美猴王事出之前,孫悟空并不完全都聽唐僧的話,甚至有時候,還鬧個小矛盾,導致唐僧只好念緊箍咒,典型的一個叛逆者形象。可自從真假美猴王事出之后,孫悟空從此保護唐僧安安分分。而以此事可以看出,孫悟空前后可判若兩人。不排除,孫悟空已被如來利用六耳獼猴一戰中,安安靜靜、無人知曉的收服了。也有人說佛祖能通曉過去未來,早就設此考驗,算到六耳獼猴必死于孫悟空手上,屆時孫悟空就能戰勝心魔,真正走上成仙之路。如果佛祖出手阻擋孫悟空的那一棍,保住六耳獼猴性命,那么設此考驗又有何意義?這也說明了,孫悟空殺死六耳獼猴,徹底清除了自己內心的邪惡一面,從內心上懂得了成仙成佛的真正的道路。所以在“真假美猴王”一難之后才會服服帖帖,真心為皈依佛門而保護唐僧。
西游記的故事還在演繹流傳,設計模式的精彩稍后繼續......