职责链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
使用场景
多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向对个对象中的一个提交一个请求。
需要动态处理一组对象处理请求。
优缺点
优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
注意事项
责任链中一个处理者对象,其中只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。
UML结构图
代码实现
interface.h
创建抽象类 - 记录器;创建实体类 - 控制台记录器、错误记录器、文件记录器
#include <string>
#include <iostream>
using namespace std;
class AbstractLogger //基类-记录器
{
public:
static const int INFO = 1;
static const int DEBUG = 2;
static const int ERROR = 3;
AbstractLogger() { nextLogger = nullptr; }
virtual ~AbstractLogger() {}
void setNextLogger(AbstractLogger *next) { nextLogger = next; }
void logMessage(int level, string message)
{
if(this->level <= level)
{
write(message);
}
else
{
assert(nextLogger != nullptr);
nextLogger->write(message);
}
}
virtual void write(string message) = 0;
protected:
int level;
AbstractLogger *nextLogger; //责任链中的下一个元素
};
class ConsoleLogger: public AbstractLogger //子类-控制台记录器
{
public:
ConsoleLogger(int level)
{
this->level = level;
cout << "init ConsoleLogger" << endl;
}
void write(string message)
{
cout << "Standard Console::Logger: " + message << endl;
}
};
class ErrorLogger: public AbstractLogger //子类-错误记录器
{
public:
ErrorLogger(int level)
{
this->level = level;
cout << "init ErrorLogger" << endl;
}
void write(string message)
{
cout << "Error Console::Logger: " + message << endl;
}
};
class FileLogger: public AbstractLogger //子类-文件记录器
{
public:
FileLogger(int level)
{
this->level = level;
cout << "init FileLogger" << endl;
}
void write(string message)
{
cout << "File::Logger: " + message << endl;
}
};
main.cpp
实例应用 - 根据logMessage函数来确定该对象是否有能力处理请求,
如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者
#include "interface.h"
int main()
{
AbstractLogger *errorLogger = new ErrorLogger(AbstractLogger::ERROR); //3
AbstractLogger *fileLogger = new FileLogger(AbstractLogger::DEBUG); //2
AbstractLogger *consoleLogger = new ConsoleLogger(AbstractLogger::INFO);//1
cout << endl;
errorLogger->setNextLogger(fileLogger);
fileLogger->setNextLogger(consoleLogger);
errorLogger->logMessage(AbstractLogger::INFO, "This is an information"); //1
errorLogger->logMessage(AbstractLogger::DEBUG, "This is an debug level information"); //2
errorLogger->logMessage(AbstractLogger::ERROR, "This is an error information"); //3
cout << endl;
fileLogger->logMessage(AbstractLogger::INFO, "This is an information"); //1
fileLogger->logMessage(AbstractLogger::DEBUG, "This is an debug level information"); //2
fileLogger->logMessage(AbstractLogger::ERROR, "This is an error information"); //3
return 0;
}
运行结果:
init ErrorLogger
init FileLogger
init ConsoleLogger
File::Logger: This is an information
File::Logger: This is an debug level information
Error Console::Logger: This is an error information
Standard Console::Logger: This is an information
File::Logger: This is an debug level information
File::Logger: This is an error information
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓