[Behavioral Patterns #1] Chain of responsibilty

GoF说:"Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it."

其实就是定义一个基类CBase,然后声明几个类C1,C2,C3...继承该基类。再把这些类串起来。
这样可以降低requester和handler之间的耦合度。

  1.  // Chain of Responsibility pattern -- Structural example
  2. using System;
  3. namespace DoFactory.GangOfFour.Chain.Structural
  4. {
  5.   // MainApp test application
  6.   class MainApp
  7.   {
  8.     static void Main()
  9.     {
  10.       // Setup Chain of Responsibility
  11.       Handler h1 = new ConcreteHandler1();
  12.       Handler h2 = new ConcreteHandler2();
  13.       Handler h3 = new ConcreteHandler3();
  14.       h1.SetSuccessor(h2);
  15.       h2.SetSuccessor(h3);
  16.       // Generate and process request
  17.       int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
  18.       foreach (int request in requests)
  19.       {
  20.         h1.HandleRequest(request);
  21.       }
  22.       // Wait for user
  23.       Console.Read();
  24.     }
  25.   }
  26.   // "Handler"
  27.   abstract class Handler
  28.   {
  29.     protected Handler successor;
  30.     public void SetSuccessor(Handler successor)
  31.     {
  32.       this.successor = successor;
  33.     }
  34.     public abstract void HandleRequest(int request);
  35.   }
  36.   // "ConcreteHandler1"
  37.   class ConcreteHandler1 : Handler
  38.   {
  39.     public override void HandleRequest(int request)
  40.     {
  41.       if (request >= 0 && request < 10)
  42.       {
  43.         Console.WriteLine("{0} handled request {1}",
  44.           this.GetType().Name, request);
  45.       }
  46.       else if (successor != null)
  47.       {
  48.         successor.HandleRequest(request);
  49.       }
  50.     }
  51.   }
  52.   // "ConcreteHandler2"
  53.   class ConcreteHandler2 : Handler
  54.   {
  55.     public override void HandleRequest(int request)
  56.     {
  57.       if (request >= 10 && request < 20)
  58.       {
  59.         Console.WriteLine("{0} handled request {1}",
  60.           this.GetType().Name, request);
  61.       }
  62.       else if (successor != null)
  63.       {
  64.         successor.HandleRequest(request);
  65.       }
  66.     }
  67.   }
  68.   // "ConcreteHandler3"
  69.   class ConcreteHandler3 : Handler
  70.   {
  71.     public override void HandleRequest(int request)
  72.     {
  73.       if (request >= 20 && request < 30)
  74.       {
  75.         Console.WriteLine("{0} handled request {1}",
  76.           this.GetType().Name, request);
  77.       }
  78.       else if (successor != null)
  79.       {
  80.         successor.HandleRequest(request);
  81.       }
  82.     }
  83.   }
  84. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值