目录
概述
责任链模式是一种行为型设计模式,它允许多个对象来处理同一个请求,形成一条责任链,直到有一个对象处理了该请求或者请求到达链的末尾。责任链模式将请求发送者和接收者解耦,使得请求发送者不需要知道具体的接收者是谁,只需要将请求发送给责任链,由责任链来决定如何处理请求。
责任链模式通常包含两个角色:抽象处理者和具体处理者。抽象处理者定义了处理请求的接口,包含了一个指向下一个处理者的引用。具体处理者继承自抽象处理者,实现了处理请求的具体逻辑,如果自己无法处理该请求,就将请求传递给下一个处理者。
优点
责任链模式的优点在于它可以将请求发送者和接收者解耦,使得请求发送者不需要知道具体的接收者是谁,只需要将请求发送给责任链,由责任链来决定如何处理请求。责任链模式还可以动态地修改责任链,增加或删除处理者,从而改变责任链的处理流程。
缺点
责任链模式的缺点在于它可能会导致请求被多次处理,因为每个处理者都可以决定是否将请求传递给下一个处理者。此外,责任链模式还可能会降低系统的性能和效率,因为它需要遍历整个责任链来寻找能够处理请求的处理者。
UML类图
下面是责任链模式的UML类图:
在UML类图中,Handler是抽象处理者,它包含了一个指向下一个处理者的引用和处理请求的抽象方法HandleRequest。ConcreteHandler是具体处理者,它们继承自Handler,实现了HandleRequest方法。客户端通过Handler来发送请求,由责任链来决定如何处理请求。
示例代码
下面是责任链模式的示例代码:
// 抽象处理者
public abstract class Handler
{
protected Handler _nextHandler;
public void SetNextHandler(Handler nextHandler)
{
_nextHandler = nextHandler;
}
public abstract void HandleRequest(int request);
}
// 具体处理者A
public class ConcreteHandlerA : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine($"{this.GetType().Name}处理了请求:{request}");
}
else if (_nextHandler != null)
{
_nextHandler.HandleRequest(request);
}
}
}
// 具体处理者B
public class ConcreteHandlerB : Handler
{
public override void HandleRequest(int request)
{
if (request >= 10 && request < 20)
{
Console.WriteLine($"{this.GetType().Name}处理了请求:{request}");
}
else if (_nextHandler != null)
{
_nextHandler.HandleRequest(request);
}
}
}
// 具体处理者C
public class ConcreteHandlerC : Handler
{
public override void HandleRequest(int request)
{
if (request >= 20 && request < 30)
{
Console.WriteLine($"{this.GetType().Name}处理了请求:{request}");
}
else if (_nextHandler != null)
{
_nextHandler.HandleRequest(request);
}
}
}
// 客户端
public class Client
{
static void Main()
{
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
handlerA.SetNextHandler(handlerB);
handlerB.SetNextHandler(handlerC);
int[] requests = { 2, 14, 25, 30 };
foreach (int request in requests)
{
handlerA.HandleRequest(request);
}
}
}
在上面的示例代码中,Handler是抽象处理者,它包含了一个指向下一个处理者的引用和处理请求的抽象方法HandleRequest。ConcreteHandlerA、ConcreteHandlerB和ConcreteHandlerC是具体处理者,它们继承自Handler,实现了HandleRequest方法。
在客户端中,首先创建了三个具体处理者对象,然后通过SetNextHandler方法将它们连接起来,形成一条责任链。最后,客户端发送了一系列请求,每个请求都被发送到责任链的头部,由责任链来决定如何处理请求。