Chain of Responsibility职责链模式属于行为型设计模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
Design Pattern:Chain of Responsibility 🔗
基本介绍 🔗
构成 🔗
- Handler:抽象处理者类,定义了一个处理请求的接口,并且持有一个后继者的引用。
- ConcreteHandler:具体处理者类,处理用户请求,如果可以处理该请求,则会处理;否则它将请求转发给其后继者。
优点 🔗
- 发送者和接收者职责分配灵活,有效降低耦合。
- 动态配置链以及添加或删除处理程序的灵活性。
- 可简化对象的相互连接,处理者类仅需维持一个指向其后继者的引用。
- 新增请求处理类很方便,使代码保持灵活。
缺点 🔗
- 由于请求可能没有明确的处理者,因此无法保证该请求一定会得到处理。
- 如果链很长或很复杂,性能可能会受到影响。
实例 🔗
C#中职责链模式的实例,游戏工作室刚刚成立,肯定很多报销需要签字,如果每笔报销都需要我签字,我将痛不欲生,所以我根据报销金额,来找对应职级的人签字即可。
/// <summary>
/// 抽象处理者类 - 审批人
/// </summary>
public abstract class Approver
{
protected Approver _nextApprover;
public void SetNextApprover(Approver approver)
{
_nextApprover = approver;
}
/// <summary>
/// 处理流程
/// </summary>
/// <param name="amount"></param>
public abstract void Process(int amount);
}
/// <summary>
/// 具体处理者类 - 部门经理
/// </summary>
public class Manager : Approver
{
public override void Process(int amount)
{
if (amount <= 1000)
Console.WriteLine("我是部门经理,报销完毕。");
else
_nextApprover?.Process(amount);
}
}
/// <summary>
/// 具体处理者类 - 首席财务官
/// </summary>
public class CFO : Approver
{
public override void Process(int amount)
{
if (amount > 1000 && amount <= 10000)
Console.WriteLine("我是首席财务官,报销完毕。");
else
_nextApprover?.Process(amount);
}
}
/// <summary>
/// 具体处理者类 - 首席执行官
/// </summary>
public class CEO : Approver
{
public override void Process(int amount)
{
Console.WriteLine("我是首席执行官,报销完毕。");
}
}
实际运行:
Approver manager = new Manager();
CFO cfo = new CFO();
CEO ceo = new CEO();
manager.SetNextApprover(cfo);
cfo.SetNextApprover(ceo);
manager.Process(5000);
manager.Process(15000);
manager.Process(15000);
结论 🔗
搬砖愉快!