设计模式_责任链模式

来源:互联网 发布:python smtp ssl 编辑:程序博客网 时间:2024/05/21 20:44

责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。


类图:



实例:

我们创建抽象类 XLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 XLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。


完整可运行代码:

#ifndef _CHAIN_OF_RESPONSIBILITY_H_#define _CHAIN_OF_RESPONSIBILITY_H_#include<iostream>#include<string>using namespace std;/* * pattern : chain of responsibility * author  : dijiang * mail    : 1195878682@qq.com *///日志的级别enum  LogLevel{    INFO=1,    DEBUG,    ERROR};//抽象的日志记录器class XLogger{public:    virtual void  doLog(LogLevel lv, string mes) = 0;    void setNextHandler(XLogger* nextLogger) { mpNextLogger = nextLogger; }protected:    XLogger* mpNextLogger;    //LogLevel mLevel;};//info 日志记录器class InfoLogger : public XLogger{public:    void doLog(LogLevel lv, string mes) override    {        if(INFO == lv)            cout << "info: " << mes << endl;        else        {            if(mpNextLogger)            {                cout << "info log pass it to next" << endl;                mpNextLogger->doLog(lv,mes);            }        }    }};//debug 日志记录器class DebugLogger : public XLogger{public:    void doLog(LogLevel lv, string mes) override    {        if(DEBUG == lv)            cout << "Debug: " << mes << endl;        else        {            if(mpNextLogger)            {                cout << "debug logger pass it to next" << endl;                mpNextLogger->doLog(lv,mes);            }        }    }};//error 日志记录器class ErrorLogger : public XLogger{public:    void doLog(LogLevel lv, string mes) override    {        if(ERROR == lv)            cout << "Error: " << mes << endl;        else        {            if(mpNextLogger)            {                cout << "Error logger pass it to next" << endl;                mpNextLogger->doLog(lv,mes);            }        }    }};#endifint main(){    XLogger* error = new ErrorLogger();    XLogger* debug = new DebugLogger();    XLogger* info  = new InfoLogger();    //构建日志处理链    error->setNextHandler(debug);    debug->setNextHandler(info);    //从链头开始处理日志    error->doLog(INFO,"this is info");    cout << "-------------------------" << endl;    error->doLog(DEBUG,"this is debug");    cout << "-------------------------" << endl;    error->doLog(ERROR,"this is error");    return 0;}

运行结果: