责任链模式
顾名思义,责任链模式(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);
}
}
}
};
#endif
int 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;
}
运行结果: