23种设计模式之《责任链模式(Chain of Responsibility)》在c#中的应用及理解

发布于:2025-03-01 ⋅ 阅读:(13) ⋅ 点赞:(0)

程序设计中的主要设计模式通常分为三大类,共23种:

1. 创建型模式(Creational Patterns)

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。

  • 工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。

  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

  • 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。

  • 原型模式(Prototype):通过复制现有对象来创建新对象。

2. 结构型模式(Structural Patterns)

  • 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。

  • 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。

  • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。

  • 装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。

  • 外观模式(Facade):为子系统中的一组接口提供一个统一的接口。

  • 享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。

  • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

3. 行为型模式(Behavioral Patterns)

  • 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。

  • 命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。

  • 解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。

  • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。

  • 中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。

  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

  • 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。

  • 状态模式(State):允许对象在其内部状态改变时改变其行为。

  • 策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。

  • 模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。

  • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

4.责任链模式(Chain of Responsibility)解释

责任链模式是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

核心思想
  1. 链式处理:将多个处理对象(Handler)链接在一起,形成一个链。
  2. 请求传递:请求沿着链传递,直到某个对象处理它。
  3. 解耦:请求的发送者不需要知道具体的处理者是谁,只需要将请求发送到链上。
适用场景
  • 当一个请求需要由多个对象中的一个或多个来处理时。
  • 当希望在不明确指定接收者的情况下,向多个对象中的一个发送请求。
  • 当需要动态指定处理请求的对象时。
优点
  • 降低耦合度:请求的发送者和处理者之间没有直接的依赖关系。
  • 灵活性:可以动态地调整链中的处理对象。
  • 扩展性:可以轻松地添加新的处理对象。
缺点
  • 请求可能不会被处理:如果链中没有对象处理请求,请求可能会被忽略。
  • 性能问题:如果链过长,可能会影响性能。

5.责任链模式的 C# 实现

以下是一个简单的责任链模式示例,模拟一个审批流程:员工提交请假申请,审批链包括组长、经理和总监,每个角色根据自己的权限处理请求。

代码实现

csharp

using System;

// 抽象处理者(Handler)
abstract class Approver
{
    protected Approver NextApprover; // 下一个处理者

    public void SetNextApprover(Approver nextApprover)
    {
        this.NextApprover = nextApprover;
    }

    public abstract void ProcessRequest(LeaveRequest request);
}

// 具体处理者:组长
class TeamLeader : Approver
{
    public override void ProcessRequest(LeaveRequest request)
    {
        if (request.Days <= 3)
        {
            Console.WriteLine($"组长批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
        }
        else if (NextApprover != null)
        {
            NextApprover.ProcessRequest(request); // 传递给下一个处理者
        }
    }
}

// 具体处理者:经理
class Manager : Approver
{
    public override void ProcessRequest(LeaveRequest request)
    {
        if (request.Days > 3 && request.Days <= 7)
        {
            Console.WriteLine($"经理批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
        }
        else if (NextApprover != null)
        {
            NextApprover.ProcessRequest(request); // 传递给下一个处理者
        }
    }
}

// 具体处理者:总监
class Director : Approver
{
    public override void ProcessRequest(LeaveRequest request)
    {
        if (request.Days > 7)
        {
            Console.WriteLine($"总监批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
        }
        else if (NextApprover != null)
        {
            NextApprover.ProcessRequest(request); // 传递给下一个处理者
        }
    }
}

// 请求类
class LeaveRequest
{
    public string EmployeeName { get; set; }
    public int Days { get; set; }

    public LeaveRequest(string employeeName, int days)
    {
        this.EmployeeName = employeeName;
        this.Days = days;
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        // 创建处理者
        Approver teamLeader = new TeamLeader();
        Approver manager = new Manager();
        Approver director = new Director();

        // 设置责任链
        teamLeader.SetNextApprover(manager);
        manager.SetNextApprover(director);

        // 创建请求
        LeaveRequest request1 = new LeaveRequest("张三", 2);
        LeaveRequest request2 = new LeaveRequest("李四", 5);
        LeaveRequest request3 = new LeaveRequest("王五", 10);

        // 处理请求
        teamLeader.ProcessRequest(request1); // 组长处理
        teamLeader.ProcessRequest(request2); // 经理处理
        teamLeader.ProcessRequest(request3); // 总监处理
    }
}

代码说明
  1. 抽象处理者(Approver)​

    • 定义了一个抽象类 Approver,包含一个指向下一个处理者的引用 NextApprover
    • 提供了一个抽象方法 ProcessRequest,用于处理请求。
  2. 具体处理者

    • TeamLeaderManager 和 Director 是具体的处理者,分别实现了 ProcessRequest 方法。
    • 每个处理者根据自己的权限决定是否处理请求,如果不能处理,则将请求传递给下一个处理者。
  3. 请求类(LeaveRequest)​

    • 表示一个请假请求,包含员工姓名和请假天数。
  4. 客户端代码

    • 创建处理者对象并设置责任链。
    • 创建不同的请假请求,并将请求发送到责任链的第一个处理者(TeamLeader)。

输出结果
组长批准了 张三 的 2 天请假申请。
经理批准了 李四 的 5 天请假申请。
总监批准了 王五 的 10 天请假申请。

6.总结

通过责任链模式,我们可以将请求的处理逻辑分散到多个对象中,从而实现解耦和灵活性。在实际开发中,责任链模式常用于审批流程、日志处理、异常处理等场景。


网站公告

今日签到

点亮在社区的每一天
去签到