责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者对请求做出响应。
在责任链模式中,每个处理者都有一个对下一个处理者的引用。如果一个处理者可以处理请求,它就会对请求进行处理。如果处理者不能处理请求,它会将请求传递给下一个处理者。这一过程会一直持续到有处理者可以处理请求或者整条链都不能处理请求。
以下是一个使用C#实现责任链模式的代码示例:
代码语言:javascript复制// 抽象处理者
public abstract class Handler
{
protected Handler _successor;
public void SetSuccessor(Handler successor)
{
_successor = successor;
}
public abstract void HandleRequest(int request);
}
// 具体处理者A
public class ConcreteHandlerA : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine($"{GetType().Name} 处理请求 {request}");
}
else if (_successor != null)
{
_successor.HandleRequest(request);
}
}
}
// 具体处理者B
public class ConcreteHandlerB : Handler
{
public override void HandleRequest(int request)
{
if (request >= 10 && request < 20)
{
Console.WriteLine($"{GetType().Name} 处理请求 {request}");
}
else if (_successor != null)
{
_successor.HandleRequest(request);
}
}
}
// 具体处理者C
public class ConcreteHandlerC : Handler
{
public override void HandleRequest(int request)
{
if (request >= 20 && request < 30)
{
Console.WriteLine($"{GetType().Name} 处理请求 {request}");
}
else if (_successor != null)
{
_successor.HandleRequest(request);
}
}
}
// 客户端
class Client
{
static void Main(string[] args)
{
// 组装责任链
ConcreteHandlerA handlerA = new ConcreteHandlerA();
ConcreteHandlerB handlerB = new ConcreteHandlerB();
ConcreteHandlerC handlerC = new ConcreteHandlerC();
handlerA.SetSuccessor(handlerB);
handlerB.SetSuccessor(handlerC);
// 发送请求
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
foreach (int request in requests)
{
handlerA.HandleRequest(request);
}
Console.ReadLine();
}
}
在上面的代码中,处理者被组装成责任链的形式,客户端发送请求时,请求首先交给责任链的第一个处理者(ConcreteHandlerA)处理,如果处理者能够处理请求,则处理请求并返回;如果处理者不能够处理请求,则将请求传递给责任链的下一个处理者(ConcreteHandlerB),以此类推,直到链上的所有处理者都不能够处理请求。