C#设计模式之ChainOfResponsibility职责链模式解决真假美猴王问题实例
作者:GhostRider 发布时间:2023-04-01 00:39:00
标签:C#,设计模式,职责链模式
本文实例讲述了C#设计模式之ChainOfResponsibility职责链模式解决真假美猴王问题。分享给大家供大家参考,具体如下:
一、理论定义
职责链模式 向一个 对象提出一个请求,如果这个对象无法处理这个请求,将指定下一个对象来处理这个请求, 直到这个请求能得到处理为止。
二、应用举例
需求描述:《西游记》里面的真假美猴王的辨别过程
六耳猕猴和孙悟空不仅外型一模一样,本事也是一模一样,走到哪儿,都无法分辨谁是真的谁是假的!
① 观音菩萨(GuangYinBodhisattva)暗念《紧箍儿咒》,两个一齐喊疼,菩萨无计奈何。
② 李天王(LiTianWang)取照妖镜照住,镜中乃是两个孙悟空,毫发不差。玉帝亦辨不出。
③唐僧(TangSeng)念《紧箍儿咒》,二人一齐叫苦,唐僧也不认得真假。
④ 阎罗殿的谛听(YanLuoDianDiTing)可以分辨的出真假,却不敢说出来。
⑤ 最后被如来(RuLai)佛辨出真假,是所有神仙都没有听说过的新物种:六耳猕猴。
三、具体编码
1. 添加一个接口,定义一个处理方法,一个指向下一个神仙的属性。
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>
/// 指定下一个神仙来判断真假美猴王
/// </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("观音菩萨暗念《紧箍儿咒》,两个一齐喊疼,菩萨无计奈何,突然想起李天王的照妖镜,对,交给他去辨别");
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("李天王取照妖镜照住,镜中乃是两个孙悟空,毫发不差。玉帝亦辨不出,两悟空大战几百回合,来到了唐僧那里");
return NextHandler.Handler(SunWukong, SixEarMacaque);
}
/// <summary>
/// 指定下一路神仙 来判断真假美猴王
/// </summary>
public IHandler NextHandler { get; set; }
}
}
4. 神仙--唐僧(其实现在还不算神仙)
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(" 唐僧念《紧箍儿咒》,二人一齐叫苦, 唐僧也不认得真假,两悟空打到阎罗殿,谛听出来辨别");
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("阎罗殿的谛听可以分辨的出真假, 却不敢说出来,因为六耳猕猴的后台很强:如来是也");
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;
//还有人说应该返回TheRealMonkeyKing.SixEarMacaque,
//因为六耳猕猴是如来佛的徒弟,用来除掉孙悟空,和菩提祖师斗智斗勇。这里打死的是真孙悟空。
//另有一说六耳猕猴是孙悟空心魔,用佛洛伊德心理学分析,孙悟空也有反抗的一面,其实还是一个孙悟空。
//还有一说是 六耳猕猴是真正的六耳猕猴,孙悟空也是真的孙悟空,
//因为孙悟空打死的是 六耳猕猴的本相,六耳猕猴没必要变个猴子给人打死。
//争议性还是蛮多。《西游记》还真是神作。
}
/// <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. 下面是主函数测试
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()//如来佛祖
};
//把各路神仙的责任划分一下,各自指定下一个神仙是谁
//观音菩萨-->托塔李天王-->唐僧-->阎罗殿谛听-->如来佛祖
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. 运行结果
附:完整实例代码点击此处本站下载。
希望本文所述对大家C#程序设计有所帮助。
来源:http://www.cnblogs.com/HCCZX/archive/2012/07/31/2616608.html
0
投稿
猜你喜欢
- 本次数据请求使用postman, postman下载地址:https://www.getpostman.com/一、页面跳转1. 页面跳转@
- 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实
- 最近完成的差不多的项目突然需要加退款的流程需求了,所以来小小的实现以下。其实对比其他的支付和退款来说,支付宝算是特别专业,也是特别简单的一个
- 一 介绍本节给知识追寻者给大家带来的是springSecurity入门篇,主要是简述下springSecrurity的启动原理和简单的入门搭
- 上一篇文章我们介绍了java实现的各种排序算法代码示例,本文我们看看Java对象的xml序列化与反序列化的相关内容,具体如下。XML是一种标
- 1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。2. 为什么需要规范呢?因为
- 一、Spring Boot的特点首先我们要知道 Spring Boot 在底层已经为我们添加好了很多依赖。比如我们常用的Tomcat,Spr
- 1 运算符1.1 概述运算符 用于连接 表达式 的 操作数,并对操作数执行运算。例如,表达式num1+num2,其操作数是num1和num2
- 目录首先,写一个需求文档:一、登录界面1.界面2.登录3.退出二、开始游戏界面三、缓冲加载游戏界面四、游戏主界面五、结束界面上代码首先,写一
- Springboot + Vue,定时任务调度的全套实现方案。这里用了quartz这个框架,实现分布式调度任务很不错,关于quarz的使用方
- 一)URL代理请求 该方式请求有两种代理方式。方式一:使用该方式代理之后,之后的所有接口都会使用代理请求// 对http开启全局代理Syst
- Java基本概念JDK包含了不少Java开发相关命令。如,javac、java、javap、javaw、javadoc。虽然现在的Java开
- 1. 基础知识集合Java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高效的进行读写,无论哪种具体
- 前言大家好,我是小郭,前面我们学习了利用Semaphore来防止多线程同时操作一个资源,通常我们都会利用并行来优化性能,但是对于串行化的业务
- 本文实例讲述了Java实现SSL双向认证的方法。分享给大家供大家参考,具体如下:我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 废话开篇:iOS与android在实现列表界面的时候是有重用机制的,目的就是减少内存开销,用时间换空间。个人感觉flutter并没有特别强调
- 这篇文章主要介绍了Spring MVC4.1服务器端推送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 本文主要和大家分享介绍了关于Java JDK * 使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:前言代理是一种常用的
- FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化