又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
🐤抽象处理者
Handler类是所有具体处理者的基类,它定义了一个Handler类型的字段successor,这个字段指向链中的下一个处理者。SetSuccessor方法用于设置这个字段的值。
当一个请求到来时,如果当前处理者无法处理,它会将请求传递给链中的下一个处理者(即successor)。这就是责任链模式的基本工作原理。
- public abstract class Handler
- {
- protected Handler successor;
-
- public void SetSuccessor(Handler successor)
- {
- this.successor = successor;
- }
-
- public abstract void HandleRequest(int request);
- }
🐤具体处理者
三个处理者类:ConcreteHandler1,ConcreteHandler2和ConcreteHandler3,它们都继承自抽象处理者类Handler。
每个具体处理者类都有一个HandleRequest方法,这个方法用于处理请求。如果当前处理者无法处理请求,那么它会将请求传递给下一个处理者。
例如,ConcreteHandler1只能处理0到10之间的请求,如果请求的值大于10,那么它就会将请求传递给下一个处理者。同样,ConcreteHandler2只能处理10到20之间的请求,如果请求的值大于20,那么它就会将请求传递给下一个处理者。ConcreteHandler3只能处理20到30之间的请求,如果请求的值大于30,那么它就会将请求传递给下一个处理者。
- public class ConcreteHandler1 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 0 && request < 10)
- {
- Console.WriteLine($"{this.GetType().Name} handled request {request}");
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
-
- public class ConcreteHandler2 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 10 && request < 20)
- {
- Console.WriteLine($"{this.GetType().Name} handled request {request}");
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
-
- public class ConcreteHandler3 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 20 && request < 30)
- {
- Console.WriteLine($"{this.GetType().Name} handled request {request}");
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
🐤测试
- class MyClass
- {
- public static void Main(string[] args)
- {
- 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);
- }
- }
- }
运行结果