读书笔记22:职责链模式
发布日期:2021-11-07 06:40:19 浏览次数:2 分类:技术文章

本文共 2578 字,大约阅读时间需要 8 分钟。

1、定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止。

    相信大家都写过if...else或者switch,当条件很多时需要写上数十行代码。如果要修改某些条件或者处理过程,就又要不断地修改这个牛叉的分支语句。这时我们可以采用职责链模式,它是将许多请求的分支或者步骤都独立出来。然后每个独立出来的部分,如果你是最终的处理那么就直接处理并结束,如果不是,那么就连接下一个处理步骤。这样就形成一个处理请求的链条。
2、角色
Handler——处理请求的接口。
CreateHandler——实现处理请示的接口的类。它可以有很多个,每一个代表一个处理步骤,并且当不满足它的条件时,会将请求交给另一个步骤。保证这个链条不能中断。
3、程序模型:
抽象接口

public abstract class Handler    {        protected Handler successor;        public void SetSuccessor(Handler successor)        {            this.successor = successor;        }        public abstract void HandlerRequest(object request);    }

具体实现类,是完整职责链的一个环节。

public class CreateHandler0 : Handler    {        public override void HandlerRequest(object request)        {            string value = request as String;            Regex regex = new Regex(@"[\u4e00-\u9fa5]", RegexOptions.IgnoreCase);            if (regex.IsMatch(value))            {                Console.WriteLine(string.Format(@"'{0}' 是汉字", value));            }            else            {                successor.HandlerRequest(request);            }        }    }    public class CreateHandler1 : Handler    {        public override void HandlerRequest(object request)        {            string value = request as String;            Regex regex = new Regex(@"^\d+$", RegexOptions.IgnoreCase);            if (regex.IsMatch(value))            {                Console.WriteLine(string.Format(@"{0}  是数字", int.Parse(value)));            }            else            {                successor.HandlerRequest(request);            }        }    }    public class CreateHandler2 : Handler    {        public override void HandlerRequest(object request)        {            Console.WriteLine(string.Format(@"{0} 既不是汉字也不是数字。",request));        }    }

调用:

static void Main(string[] args)        {            Handler handler0 = new CreateHandler0();            Handler handler1 = new CreateHandler1();            Handler handler2 = new CreateHandler2();            handler0.SetSuccessor(handler1);            handler1.SetSuccessor(handler2);            string string1 = "中国";            string string2 = "110";            string string3 = "++--";            Console.WriteLine("测试:{0}",string1);            handler0.HandlerRequest(string1);            Console.WriteLine("测试:{0}", string2);            handler0.HandlerRequest(string2);            Console.WriteLine("测试:{0}", string3);            handler0.HandlerRequest(string3);            Console.Read();        }

 

这样,对请求步骤可以随时的增加或者修改,增强了处理对象的灵活性。从结构上来看有些类似于建造者模式,都是将步骤分离出来。只是建造者不需要指向后一个。

模型代码:

转载地址:https://blog.csdn.net/yysyangyangyangshan/article/details/7395632 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:二分法简单排序和查找
下一篇:冒泡和快速排序

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月14日 15时19分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

c#背单词小程序视频_C#用timer实现背单词小程序 2019-04-21
24v开关电源维修技巧_【电视技术】液晶电视电源板十个维修经验分享 2019-04-21
laravel comment显示到页面最上面了_使用 Laravel 快速开发API接口,新手必读 2019-04-21
echart实现3d地图_orbslam_2生成稀疏点云地图的保存与加载的实现 邹鹏程 2019.9.15... 2019-04-21
bash 不是内部或外部命令_python学习笔记6-pip命令不是内部命令问题 2019-04-21
管道的另一端上无任何进程。_别被忽悠入坑!信号贴贴上就能信号满格?对手机信号无任何改善... 2019-04-21
mysql无法写数据库_求助,为何我的数据不能写入数据库 2019-04-21
ssh 两个mysql数据库_ssh连接两个数据库(转) 2019-04-21
mysql 双向链表_23张图!万字详解「链表」,从小白到大佬! 2019-04-21
mysql 常量命名规则_详解Java编程规约(命名风格、常量定义、代码格式) 2019-04-21
pomelo mysql_全文索引 - Pomelo.EFCore.MySql 2019-04-21
如何打开git命令窗口_win10系统如何将右键菜单中“在此处打开powershell窗口”调整为“在此处打开命令窗口”?... 2019-04-21
rtsp 华为_华为多实例生成树RSTP配置详解 2019-04-21
php不需要也能输出,php 如何只输出最后生成的那个值?? 2019-04-21
php正则过滤sql关键字,使用正则表达式屏蔽关键字的方法 2019-04-21
php取整v,php取整方式分享 2019-04-21
php写模糊搜索api接口,php通过sphinxapi接口实现全文搜索 2019-04-21
oracle安装出现2932,【案例】Oracle报错ORA-19815 fast_recovery_area无剩余空间解决办法... 2019-04-21
rac数据库下oracle打小补丁,Oracle 11g RAC 环境打PSU补丁的详细步骤 2019-04-21
form表单属性名相同java_form表单提交时候有多个相同name 的input如何处理? 2019-04-21