概述
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着处理者链传递,直到有一个处理者处理它为止。责任链模式使得多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。通过将请求的处理者连成一条链,责任链模式可以动态地指定处理者的顺序。
结构
责任链模式包含以下几个角色:
- 处理者(Handler):定义一个处理请求的接口,并实现后继链的设置。
- 具体处理者(ConcreteHandler):实现处理者接口,处理它所负责的请求,或者将请求传递给后继者。
- 客户端(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.");}
}
应用场景
责任链模式适用于以下场景:
- 多个对象可以处理同一个请求:具体处理者之间可以动态指定处理顺序。
- 一个请求需要多个对象进行处理:可以动态地添加或删除处理者。
- 请求的处理者不明确:客户端不需要知道请求的处理者是谁,处理者可以在运行时动态确定。
优缺点
优点
- 降低耦合度:责任链模式通过将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。
- 动态组合:可以根据需要动态地组合处理者,增加系统的灵活性和可扩展性。
缺点
- 请求处理不保证:如果链上的所有处理者都不能处理请求,可能会导致请求得不到处理。
- 性能开销:责任链模式可能会增加系统的性能开销,特别是当链条过长时。