当你想要让一个以上的对象有机会能够处理某个请求的时候,就可以使用责任链模式。
责任链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
通过责任链模式,你可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。链中的每个对象扮演处理器,并且有一个后继对象。如果它可以处理请求,就进行处理,否则把请求转发给后继者。
通过改变链内的成员或调动它们的次序,允许你动态地新增或删除责任。
案例:
假设我们要对考试分数(百分制)进行不同等级的处理,主要分为A、B、C、D、E五级形成一条责任链,各个成员按照分数区间处理该分数,如果不属于该成员的处理范围就传送给它的后继对象处理。
类图:
实现如下:
gradeHandler.h:
#ifndef GRADEHANDLER_H
#define GRADEHANDLER_H
#include <iostream>
using namespace std;
class GradeHandler {
public:
virtual void handle(int grade) = 0;
protected:
GradeHandler* m_successor;
};
class EHandler : public GradeHandler {
public:
EHandler()
{
m_successor = NULL;
}
virtual void handle(int grade) override
{
cout << "E等级处理" << endl;
}
};
class DHandler : public GradeHandler {
public:
DHandler()
{
m_successor = new EHandler();
}
virtual void handle(int grade) override
{
if(grade <= 70 && grade > 60)
{
cout << "D等级处理" << endl;
}
else
{
m_successor->handle(grade);
}
}
};
class CHandler : public GradeHandler {
public:
CHandler()
{
m_successor = new DHandler();
}
virtual void handle(int grade) override
{
if(grade <= 80 && grade > 70)
{
cout << "C等级处理" << endl;
}
else
{
m_successor->handle(grade);
}
}
};
class BHandler : public GradeHandler {
public:
BHandler()
{
m_successor = new CHandler();
}
virtual void handle(int grade) override
{
if(grade <= 90 && grade > 80)
{
cout << "B等级处理" << endl;
}
else
{
m_successor->handle(grade);
}
}
};
class AHandler : public GradeHandler {
public:
AHandler()
{
m_successor = new BHandler();
}
virtual void handle(int grade) override
{
if(grade <= 100 && grade > 90)
{
cout << "A等级处理" << endl;
}
else
{
m_successor->handle(grade);
}
}
};
#endif // GRADEHANDLER_H
main.cpp:
/*
* 责任链模式
*
* date:2023-9-19
*/
#include "gradeHandler.h"
int main()
{
cout << "请输入分数: ";
int grade;
cin >> grade;
GradeHandler* gradeHandler = new AHandler();
gradeHandler->handle(grade);
}
运行截图: