设计模式 - 责任链模式

概述

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着处理者链传递,直到有一个处理者处理它为止。责任链模式使得多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。通过将请求的处理者连成一条链,责任链模式可以动态地指定处理者的顺序。

结构

责任链模式包含以下几个角色:

  1. 处理者(Handler):定义一个处理请求的接口,并实现后继链的设置。
  2. 具体处理者(ConcreteHandler):实现处理者接口,处理它所负责的请求,或者将请求传递给后继者。
  3. 客户端(Client):向链上的具体处理者对象提交请求。

示例代码

假设我们有一个应用程序需要处理不同级别的日志消息(如信息、警告和错误)。
代码地址

处理者接口

public abstract class Logger
{
    protected Logger _nextLogger;

    public void SetNextLogger(Logger nextLogger)
    {
        _nextLogger = nextLogger;
    }

    public void LogMessage(int level, string message)
    {
        if (CanHandle(level))
        {
            Write(message);
        }
        else if (_nextLogger != null)
        {
            _nextLogger.LogMessage(level, message);
        }
    }

    protected abstract bool CanHandle(int level);
    protected abstract void Write(string message);
}

具体处理者

public class InfoLogger : Logger
{
    protected override bool CanHandle(int level)
    {
        return level == 1;
    }

    protected override void Write(string message)
    {
        Console.WriteLine("InfoLogger: " + message);
    }
}

public class WarningLogger : Logger
{
    protected override bool CanHandle(int level)
    {
        return level == 2;
    }

    protected override void Write(string message)
    {
        Console.WriteLine("WarningLogger: " + message);
    }
}

public class ErrorLogger : Logger
{
    protected override bool CanHandle(int level)
    {
        return level == 3;
    }

    protected override void Write(string message)
    {
        Console.WriteLine("ErrorLogger: " + message);
    }
}

客户端代码

class Program
{
    static void Main(string[] args)
    {
        Logger infoLogger = new InfoLogger();
        Logger warningLogger = new WarningLogger();
        Logger errorLogger = new ErrorLogger();

        infoLogger.SetNextLogger(warningLogger);
        warningLogger.SetNextLogger(errorLogger);

        infoLogger.LogMessage(1, "This is an information.");
        infoLogger.LogMessage(2, "This is a warning.");
        infoLogger.LogMessage(3, "This is an error.");
    }
}

应用场景

责任链模式适用于以下场景:

  1. 多个对象可以处理同一个请求:具体处理者之间可以动态指定处理顺序。
  2. 一个请求需要多个对象进行处理:可以动态地添加或删除处理者。
  3. 请求的处理者不明确:客户端不需要知道请求的处理者是谁,处理者可以在运行时动态确定。

优缺点

优点

  • 降低耦合度:责任链模式通过将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。
  • 动态组合:可以根据需要动态地组合处理者,增加系统的灵活性和可扩展性。

缺点

  • 请求处理不保证:如果链上的所有处理者都不能处理请求,可能会导致请求得不到处理。
  • 性能开销:责任链模式可能会增加系统的性能开销,特别是当链条过长时。
posted @   贾光辉  阅读(27)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示