读书笔记22:职责链模式

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();          }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值