陈巧倩

设计模式-职责链模式

· 172 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

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);

结论 🔗

搬砖愉快!