职责链(Chain of Responsibility)模式:使多个对象都有机会处理请求,从而避免请求发送者呵接受者之间的耦合关系。
将这个对象连成一条链子,并沿着这条链传递该请求,知道有一个对象处理它。
/*
* 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。
这个角色通常由一个抽象类或接口实现。
* 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
*/
在抽象处理者(Handler) 设置继任者:
protected Handler successor; // 方法 public void SetSuccessor(Handler successor) { this.successor = successor; }
以便于找到下一个人。
// 设置链的责任 Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); // 生成和处理请求 int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach (int request in requests) h1.HandleRequest(request); Console.WriteLine(" ================== "); /// <summary> /// 抽象处理者(Handler)角色 /// </summary> public abstract class Handler { protected Handler successor; // 方法 public void SetSuccessor(Handler successor) { this.successor = successor; } abstract public void HandleRequest(int request); } /// <summary> /// 具体处理者1 /// </summary> public class ConcreteHandler1 : Handler { //从写基类 方法 public override void HandleRequest(int request) { if (request >= 0 && request < 10) Console.WriteLine("{0} handled request {1}", this, request); else if (successor != null) successor.HandleRequest(request); } } /// <summary> /// 具体处理者2 /// </summary> public class ConcreteHandler2 : Handler { public override void HandleRequest(int request) { if (request >= 10 && request < 20) Console.WriteLine("{0} handled request {1}", this, request); else if (successor != null) successor.HandleRequest(request); } } // 具体处理者3 class ConcreteHandler3 : Handler { public override void HandleRequest(int request) { if (request >= 20 && request < 30) Console.WriteLine("{0} handled request {1}", this, request); else if (successor != null) successor.HandleRequest(request); } }