博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式系列 - 责任链模式
阅读量:5138 次
发布时间:2019-06-13

本文共 2340 字,大约阅读时间需要 7 分钟。

责任链模式通过为请求创建一个 接收者对象的链,对请求的发送者和接收者进行解耦。

介绍

责任链属于行为型模式,在这种模式中,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么则会继续往下传递,依此类推。可以参考 C# 中的事件处理程序就是采用这种思想。

类图描述

749711-20181204215108651-442492.png

代码实现

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();    }}

总结

责任链模式多在事件传递中有实际运用,通过链式结构将多个处理类关联起来,简化了上层调用,但是需要注意的是避免出现循环调用。

转载于:https://www.cnblogs.com/hippieZhou/p/10055183.html

你可能感兴趣的文章
Java 如何抛出异常、自定义异常
查看>>
c语言实现n!算法
查看>>
中文文本分类之TextRNN
查看>>
HUAS 1483 mex(莫队算法)
查看>>
asp邮件发送
查看>>
Android ListView下拉刷新 Demo
查看>>
Python-装饰器(Decorator)
查看>>
SAP虚拟机的使用方法
查看>>
剑指offer(41-45)编程题
查看>>
Linux套接字和I/O模型
查看>>
HTML 之 CSS
查看>>
ASP.NET MVC 音乐商店 - 5. 通过支架创建编辑表单
查看>>
[HNOI2006] 超级英雄
查看>>
https 学习笔记二
查看>>
NYOJ题目77开灯问题
查看>>
Lintcode 97.二叉树的最大深度
查看>>
代码杂记3-2
查看>>
水题 Codeforces Round #105 (Div. 2) B. Escape
查看>>
Python使用Redis数据库
查看>>
Java的修饰符
查看>>