1. 职责链模式简介
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其目的是将请求的发送者与接收者解耦,将多个对象组成一条链,依次处理该请求,直到请求被处理或者到达链的末尾。这样可以避免请求的发送者和接收者之间的直接关联,使系统更加灵活可扩展。
2. 职责链模式的结构
职责链模式由以下几个角色组成:
抽象处理者(Handler):定义处理请求的接口,同时持有下一个处理者的引用。
具体处理者(ConcreteHandler):实现抽象处理者的接口,负责处理请求。如果无法处理,则将请求转发给下一个处理者。
客户端(Client):创建处理者链,并发送请求给链中的第一个处理者。
3. 职责链模式示例代码
下面以请假审批的场景为例,演示职责链模式的实现。
3.1 抽象处理者
public abstract class Approver
{
protected Approver successor;
public void SetSuccessor(Approver successor)
{
this.successor = successor;
}
public abstract void ProcessRequest(LeaveRequest request);
}
3.2 具体处理者
public class Supervisor : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days <= 2)
{
Console.WriteLine("Supervisor approved the leave request.");
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
public class Manager : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days <= 5)
{
Console.WriteLine("Manager approved the leave request.");
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
public class Director : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days > 5)
{
Console.WriteLine("Director approved the leave request.");
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
3.3 客户端
public class Client
{
public void ApproveLeaveRequest(LeaveRequest request)
{
Approver supervisor = new Supervisor();
Approver manager = new Manager();
Approver director = new Director();
supervisor.SetSuccessor(manager);
manager.SetSuccessor(director);
supervisor.ProcessRequest(request);
}
}
public class LeaveRequest
{
public int Days { get; set; }
}
4. 职责链模式的应用场景
职责链模式适用于以下场景:
- 当有多个对象可以处理同一个请求,但需要根据请求的不同特征来决定具体由哪个对象来处理。
- 当不希望请求的发送者和接收者之间存在直接的耦合关系。
- 当需要动态添加或删除处理者。
5. 职责链模式的优缺点
优点:
- 将请求的发送者和接收者解耦,增强系统的灵活性。
- 可以动态增加或删除处理者,方便扩展和维护。
缺点:
- 请求可能会一直传递到链的末尾,如果处理者链比较长,可能会影响性能。
6. 总结
通过本文的示例代码和解析,我们了解了职责链模式的定义、结构、应用场景以及优缺点。职责链模式可以在请求的发送者和接收者之间建立一个灵活可扩展的链,使系统更加灵活和可维护。在实际项目中,根据具体的业务场景合理应用职责链模式,可以提高系统的可扩展性和复用性。