C#設(shè)計(jì)模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題實(shí)例
本文實(shí)例講述了C#設(shè)計(jì)模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題。分享給大家供大家參考,具體如下:
一、理論定義
職責(zé)鏈模式 向一個(gè) 對(duì)象提出一個(gè)請(qǐng)求,如果這個(gè)對(duì)象無法處理這個(gè)請(qǐng)求,將指定下一個(gè)對(duì)象來處理這個(gè)請(qǐng)求, 直到這個(gè)請(qǐng)求能得到處理為止。
二、應(yīng)用舉例
需求描述:《西游記》里面的真假美猴王的辨別過程
六耳獼猴和孫悟空不僅外型一模一樣,本事也是一模一樣,走到哪兒,都無法分辨誰是真的誰是假的!
① 觀音菩薩(GuangYinBodhisattva)暗念《緊箍兒咒》,兩個(gè)一齊喊疼,菩薩無計(jì)奈何。
② 李天王(LiTianWang)取照妖鏡照住,鏡中乃是兩個(gè)孫悟空,毫發(fā)不差。玉帝亦辨不出。
③唐僧(TangSeng)念《緊箍兒咒》,二人一齊叫苦,唐僧也不認(rèn)得真假。
④ 閻羅殿的諦聽(YanLuoDianDiTing)可以分辨的出真假,卻不敢說出來。
⑤ 最后被如來(RuLai)佛辨出真假,是所有神仙都沒有聽說過的新物種:六耳獼猴。
三、具體編碼
1. 添加一個(gè)接口,定義一個(gè)處理方法,一個(gè)指向下一個(gè)神仙的屬性。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { /// <summary> /// 真 美猴王 /// </summary> public enum TheRealMonkeyKing { SunWukong=1,//孫悟空 SixEarMacaque=2//六耳獼猴 } public interface IHandler { /// <summary> /// 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque); /// <summary> /// 指定下一個(gè)神仙來判斷真假美猴王 /// </summary> IHandler NextHandler{get;set;} } }
2. 神仙--觀音菩薩
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { public class GuangYinBodhisattva:IHandler { /// <summary> /// 觀音菩薩 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> public TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque){ Console.WriteLine("觀音菩薩暗念《緊箍兒咒》,兩個(gè)一齊喊疼,菩薩無計(jì)奈何,突然想起李天王的照妖鏡,對(duì),交給他去辨別"); return NextHandler.Handler(SunWukong,SixEarMacaque); } /// <summary> /// 指定下一路神仙 來判斷真假美猴王 /// </summary> public IHandler NextHandler { get; set; } } }
3. 神仙--托塔李天王
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { public class LiTianWang : IHandler { /// <summary> /// 李天王 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> public TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque) { Console.WriteLine("李天王取照妖鏡照住,鏡中乃是兩個(gè)孫悟空,毫發(fā)不差。玉帝亦辨不出,兩悟空大戰(zhàn)幾百回合,來到了唐僧那里"); return NextHandler.Handler(SunWukong, SixEarMacaque); } /// <summary> /// 指定下一路神仙 來判斷真假美猴王 /// </summary> public IHandler NextHandler { get; set; } } }
4. 神仙--唐僧(其實(shí)現(xiàn)在還不算神仙)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { public class TangSeng : IHandler { /// <summary> /// 唐僧 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> public TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque) { Console.WriteLine(" 唐僧念《緊箍兒咒》,二人一齊叫苦, 唐僧也不認(rèn)得真假,兩悟空打到閻羅殿,諦聽出來辨別"); return NextHandler.Handler(SunWukong, SixEarMacaque); } /// <summary> /// 指定下一路神仙 來判斷真假美猴王 /// </summary> public IHandler NextHandler { get; set; } } }
5. 神仙---閻羅殿諦聽
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { public class YanLuoDianDiTing : IHandler { /// <summary> /// 閻羅殿的諦聽 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> public TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque) { Console.WriteLine("閻羅殿的諦聽可以分辨的出真假, 卻不敢說出來,因?yàn)榱J猴的后臺(tái)很強(qiáng):如來是也"); return NextHandler.Handler(SunWukong, SixEarMacaque); } /// <summary> /// 指定下一路神仙 來判斷真假美猴王 /// </summary> public IHandler NextHandler { get; set; } } }
6. 神仙--如來佛祖
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { public class RuLai : IHandler { /// <summary> /// 唐僧 判斷真假美猴王 /// </summary> /// <param name="SunWukong">孫悟空</param> /// <param name="SixEarMacaque">六耳獼猴</param> /// <returns></returns> public TheRealMonkeyKing Handler(string SunWukong, string SixEarMacaque) { Console.WriteLine(" 如來佛辨出真假,是所有神仙都沒有聽說過的新物種:六耳獼猴"); //返回孫悟空,沒有NextHandler了 return TheRealMonkeyKing.SunWukong; //還有人說應(yīng)該返回TheRealMonkeyKing.SixEarMacaque, //因?yàn)榱J猴是如來佛的徒弟,用來除掉孫悟空,和菩提祖師斗智斗勇。這里打死的是真孫悟空。 //另有一說六耳獼猴是孫悟空心魔,用佛洛伊德心理學(xué)分析,孫悟空也有反抗的一面,其實(shí)還是一個(gè)孫悟空。 //還有一說是 六耳獼猴是真正的六耳獼猴,孫悟空也是真的孫悟空, //因?yàn)閷O悟空打死的是 六耳獼猴的本相,六耳獼猴沒必要變個(gè)猴子給人打死。 //爭議性還是蠻多。《西游記》還真是神作。 } /// <summary> /// 指定下一路神仙 來判斷真假美猴王 /// </summary> public IHandler NextHandler { get; set; } } }
7. 判斷真假美猴王入口
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.ChainOfResponsibility { /// <summary> /// 判斷真假美猴王入口 /// </summary> public class JudgementTheKingOfMonkey { //各路神仙都請(qǐng)來,放一起 public IHandler GuangYinBodhisattva { get; set; } public IHandler LiTianWang { get; set; } public IHandler TangSeng { get; set; } public IHandler YanLuoDianDiTing { get; set; } public IHandler RuLai { get; set; } /// <summary> /// 判斷真假美猴王,首先從觀音菩薩開始 /// </summary> /// <returns></returns> public TheRealMonkeyKing Judge(string SunWuKong,string SixEarMacaque) { return GuangYinBodhisattva.Handler(SunWuKong, SixEarMacaque); } } }
8. 下面是主函數(shù)測試
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Com.Design.Gof.Observer; using Com.Design.Gof.ChainOfResponsibility; namespace Com.Design.Gof.Test { class Program { static void Main(string[] args) { #region ChainOfResponsibility //判斷真假孫悟空,首先把各路神仙都new一下,讓他們先喝茶休息 JudgementTheKingOfMonkey judgement = new JudgementTheKingOfMonkey { GuangYinBodhisattva = new GuangYinBodhisattva(),//觀音菩薩 LiTianWang = new LiTianWang(),//托塔李天王 TangSeng = new TangSeng(),//唐僧 YanLuoDianDiTing = new YanLuoDianDiTing(),//閻羅殿諦聽 RuLai = new RuLai()//如來佛祖 }; //把各路神仙的責(zé)任劃分一下,各自指定下一個(gè)神仙是誰 //觀音菩薩-->托塔李天王-->唐僧-->閻羅殿諦聽-->如來佛祖 judgement.GuangYinBodhisattva.NextHandler = judgement.LiTianWang; judgement.LiTianWang.NextHandler = judgement.TangSeng; judgement.TangSeng.NextHandler = judgement.YanLuoDianDiTing; judgement.YanLuoDianDiTing.NextHandler = judgement.RuLai; //兩美猴王入場 string SunWuKong = "SunWuKong", SixEarMacaque = "SixEarMacaque"; //開始判斷真假美猴王 TheRealMonkeyKing RealMonkeyKing = judgement.Judge(SunWuKong, SixEarMacaque); Console.WriteLine(); Console.WriteLine("Then,真正的美猴王是:" + RealMonkeyKing + "孫悟空"); #endregion Console.ReadKey(); } } }
9. 運(yùn)行結(jié)果
附:完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于C#相關(guān)內(nèi)容還可查看本站專題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#窗體操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#使用DateAndTime.DateDiff實(shí)現(xiàn)計(jì)算年齡
這篇文章主要為大家詳細(xì)介紹了C#如何使用DateAndTime.DateDiff實(shí)現(xiàn)根據(jù)生日計(jì)算年齡,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法
這篇文章主要介紹了Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法,Windows?11下所有控件已經(jīng)默認(rèn)采用圓角,其效果更好、相對(duì)有著更好的優(yōu)化,只是這是默認(rèn)的行為,無法進(jìn)一步自定義,更多詳情需要的小伙伴可以參考下面文章內(nèi)容2022-08-08C#把EXCEL數(shù)據(jù)轉(zhuǎn)換成DataTable
這篇文章介紹了C#把EXCEL數(shù)據(jù)轉(zhuǎn)換成DataTable的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布
在消息隊(duì)列模型中,如何將消息廣播到所有的消費(fèi)者,這種模式成為“發(fā)布/訂閱”。本文主要以一個(gè)簡單的小例子,簡述通過fanout交換機(jī),實(shí)現(xiàn)消息的發(fā)布與訂閱,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。2021-05-05