C#設(shè)計(jì)模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題實(shí)例
本文實(shí)例講述了C#設(shè)計(jì)模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題。分享給大家供大家參考,具體如下:
一、理論定義
職責(zé)鏈模式 向一個(gè) 對象提出一個(gè)請求,如果這個(gè)對象無法處理這個(gè)請求,將指定下一個(gè)對象來處理這個(gè)請求, 直到這個(gè)請求能得到處理為止。
二、應(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ì)奈何,突然想起李天王的照妖鏡,對,交給他去辨別");
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
{
//各路神仙都請來,放一起
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ì)入門教程》
希望本文所述對大家C#程序設(shè)計(jì)有所幫助。
欄 目:C#教程
下一篇:c#使用Socket發(fā)送HTTP/HTTPS請求的實(shí)現(xiàn)代碼
本文標(biāo)題:C#設(shè)計(jì)模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題實(shí)例
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5499.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#一個(gè)簡單的定時(shí)小程序?qū)崿F(xiàn)代碼
- 01-10微信開放平臺(tái)之網(wǎng)站授權(quán)微信登錄功能
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一
- 01-10C#編程自學(xué)之流程控制語句


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?


