又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
抽象处理者
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);
}
}
}
运行结果