设计模式笔记(二十) —— 职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
     优点:当客户提交一个请求时,请求是沿链传递直到有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用,这就大大降低了耦合度,增加了给对象指派职责的灵活性。 

  1. using System;
  2. using System.Collections.Generic;
  3. /**
  4.  * 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  5.  * 优点:当客户提交一个请求时,请求是沿链传递直到有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用,这就大大降低了耦合度,增加了给对象指派职责的灵活性。
  6.  */
  7. namespace StuDesignMode.ChainOfDuty
  8. {
  9.     #region 职责链模式
  10.     abstract class AbsHandler
  11.     {
  12.         protected AbsHandler Successor { getset; }
  13.         public void SetSuccessor(AbsHandler successor)
  14.         {
  15.             Successor = successor;
  16.         }
  17.         public abstract void HandleRquest(int request);
  18.     }
  19.     class ConcreteHandler1 : AbsHandler
  20.     {
  21.         public override void HandleRquest(int request)
  22.         {
  23.             if (request >= 0 && request < 10)
  24.             {
  25.                 Console.WriteLine("{0}处理请求{1}"this.GetType().Name,request);
  26.             }
  27.             else if(this.Successor != null)
  28.             {
  29.                 Successor.HandleRquest(request); //转移请求到下一位
  30.             }
  31.         }
  32.     }
  33.     class ConcreteHandler2 : AbsHandler
  34.     {
  35.         public override void HandleRquest(int request)
  36.         {
  37.             if (request >= 10 && request < 100)
  38.             {
  39.                 Console.WriteLine("{0}处理请求{1}"this.GetType().Name,request);
  40.             }
  41.             else if (this.Successor != null)
  42.             {
  43.                 Successor.HandleRquest(request); //转移请求到下一位
  44.             }
  45.         }
  46.     }
  47.     class ConcreteHandler3 : AbsHandler
  48.     {
  49.         public override void HandleRquest(int request)
  50.         {
  51.             if (request >= 100 && request < 1000)
  52.             {
  53.                 Console.WriteLine("{0}处理请求{1}"this.GetType().Name,request);
  54.             }
  55.             else if (this.Successor != null)
  56.             {
  57.                 Successor.HandleRquest(request); //转移请求到下一位
  58.             }
  59.         }
  60.     }
  61.     class ClientTest
  62.     {
  63.         static void Main(string[] args)
  64.         {
  65.             AbsHandler h1 = new ConcreteHandler1();
  66.             AbsHandler h2 = new ConcreteHandler2();
  67.             AbsHandler h3 = new ConcreteHandler3();
  68.             h1.SetSuccessor(h2);
  69.             h2.SetSuccessor(h3);
  70.             int[] reqs = { 1, 50, 500, 1421, 20 };
  71.             foreach (int i in reqs)
  72.             {
  73.                 h1.HandleRquest(i);
  74.             }
  75.             Console.WriteLine();
  76.         }
  77.     }
  78.     #endregion
  79. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值