职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
优点:当客户提交一个请求时,请求是沿链传递直到有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用,这就大大降低了耦合度,增加了给对象指派职责的灵活性。
- using System;
- using System.Collections.Generic;
- /**
- * 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
- * 优点:当客户提交一个请求时,请求是沿链传递直到有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用,这就大大降低了耦合度,增加了给对象指派职责的灵活性。
- */
- namespace StuDesignMode.ChainOfDuty
- {
- #region 职责链模式
- abstract class AbsHandler
- {
- protected AbsHandler Successor { get; set; }
- public void SetSuccessor(AbsHandler successor)
- {
- Successor = successor;
- }
- public abstract void HandleRquest(int request);
- }
- class ConcreteHandler1 : AbsHandler
- {
- public override void HandleRquest(int request)
- {
- if (request >= 0 && request < 10)
- {
- Console.WriteLine("{0}处理请求{1}", this.GetType().Name,request);
- }
- else if(this.Successor != null)
- {
- Successor.HandleRquest(request); //转移请求到下一位
- }
- }
- }
- class ConcreteHandler2 : AbsHandler
- {
- public override void HandleRquest(int request)
- {
- if (request >= 10 && request < 100)
- {
- Console.WriteLine("{0}处理请求{1}", this.GetType().Name,request);
- }
- else if (this.Successor != null)
- {
- Successor.HandleRquest(request); //转移请求到下一位
- }
- }
- }
- class ConcreteHandler3 : AbsHandler
- {
- public override void HandleRquest(int request)
- {
- if (request >= 100 && request < 1000)
- {
- Console.WriteLine("{0}处理请求{1}", this.GetType().Name,request);
- }
- else if (this.Successor != null)
- {
- Successor.HandleRquest(request); //转移请求到下一位
- }
- }
- }
- class ClientTest
- {
- static void Main(string[] args)
- {
- AbsHandler h1 = new ConcreteHandler1();
- AbsHandler h2 = new ConcreteHandler2();
- AbsHandler h3 = new ConcreteHandler3();
- h1.SetSuccessor(h2);
- h2.SetSuccessor(h3);
- int[] reqs = { 1, 50, 500, 1421, 20 };
- foreach (int i in reqs)
- {
- h1.HandleRquest(i);
- }
- Console.WriteLine();
- }
- }
- #endregion
- }