设计模式系列 - 责任链模式
程序员文章站
2022-05-02 11:27:42
责任链模式通过为请求创建一个 接收者对象的链,对请求的发送者和接收者进行解耦。 介绍 责任链属于行为型模式,在这种模式中,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么则会继续往下传递,依此类推。可以参考 C 中的事件处理程序就是采用这种思想。 类图描述 代码实现 1、创 ......
责任链模式通过为请求创建一个 接收者对象的链,对请求的发送者和接收者进行解耦。
介绍
责任链属于行为型模式,在这种模式中,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么则会继续往下传递,依此类推。可以参考 c# 中的事件处理程序就是采用这种思想。
类图描述
代码实现
1、创建抽象的记录器类
public abstract class abstractlogger { public static int info = 1; public static int debug = 2; public static int error = 3; protected int level; protected abstractlogger nextlogger; public void setnextlogger(abstractlogger nextlogger) { this.nextlogger = nextlogger; } public void logmessage(int level, string message) { if (this.level <= level) { write(message); } if (this.nextlogger != null) { nextlogger.logmessage(level, message); } } protected abstract void write(string message); }
2、创建扩展了该记录器类的实体类
public class consolelogger:abstractlogger { public consolelogger(int level) { this.level = level; } protected override void write(string message) => console.writeline($"standard console::logger{message}"); } public class errorlogger:abstractlogger { public errorlogger(int level) { this.level = level; } protected override void write(string message) => console.writeline($"error console::logger:{message}"); } public class filelogger:abstractlogger { public filelogger(int level) { this.level = level; } protected override void write(string message) => console.writeline($"file::logger:{message}"); }
3、上层调用
class program { private static abstractlogger getchainloggers() { abstractlogger errorlogger = new errorlogger(abstractlogger.error); abstractlogger filelogger = new filelogger(abstractlogger.debug); abstractlogger consolelogger = new consolelogger(abstractlogger.info); errorlogger.setnextlogger(filelogger); filelogger.setnextlogger(consolelogger); return errorlogger; } static void main(string[] args) { var loggerchain = getchainloggers(); loggerchain.logmessage(abstractlogger.info, "this is an information"); loggerchain.logmessage(abstractlogger.debug, "this is an debug level information"); loggerchain.logmessage(abstractlogger.error, "this is an error information"); console.readkey(); } }
总结
责任链模式多在事件传递中有实际运用,通过链式结构将多个处理类关联起来,简化了上层调用,但是需要注意的是避免出现循环调用。