设计模式 - 责任链模式

概述

责任链模式(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 @ 2025-01-03 16:07  贾光辉  阅读(18)  评论(0编辑  收藏  举报