概念
此模式允许将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
该模式能将多个处理者连接成一条链。接收到请求后,它会“询问”每个处理者是否能够对其进行处理。这样所有处理者都有机会来处理请求。
代码示例
代码来自这里,有改动。
//抽象管理者
class Manager
{
protected:
Manager * superiorManager;//上级管理者
QString name;
public:
Manager(Manager *manager, QString name):superiorManager(manager), name(name){}
virtual void DealWithRequest(QString name, int num) {}
};
//经理
class CommonManager: public Manager
{
public:
CommonManager(Manager *manager, QString name):Manager(manager,name) {}
void DealWithRequest(QString name, int num)
{
if(num < 500) //经理职权之内
{
qDebug()<<"经理"<<this->name<<"批准"<<name<<"加薪"<<num<<"元";
}
else
{
qDebug()<<"经理"<<this->name<<"无法处理,交由总监处理";
superiorManager->DealWithRequest(name, num);
}
}
};
//总监
class Majordomo: public Manager
{
public:
Majordomo(Manager *manager, QString name):Manager(manager,name) {}
void DealWithRequest(QString name, int num)
{
if(num < 1000) //总监职权之内
{
qDebug()<<"总监"<<this->name<<"批准"<<name<<"加薪"<<num<<"元";
}
else
{
qDebug()<<"总监"<<this->name<<"无法处理,交由总经理处理";
superiorManager->DealWithRequest(name, num);
}
}
};
//总经理
class GeneralManager: public Manager
{
public:
GeneralManager(Manager *manager, QString name):Manager(manager,name) {}
void DealWithRequest(QString name, int num) //总经理可以处理所有请求
{
qDebug()<<"总经理"<<this->name<<"批准"<<name<<"加薪"<<num<<"元";
}
};
int main(int argc, char *argv[])
{
Manager *general = new GeneralManager(nullptr, "总经理张三"); //设置上级,总经理没有上级
Manager *majordomo = new Majordomo(general, "总监李四"); //设置上级
Manager *common = new CommonManager(majordomo, "经理王五"); //设置上级
common->DealWithRequest("员工A",300); //员工A要求加薪
qDebug()<<"-----------------------------------";
common->DealWithRequest("员工B", 600);
qDebug()<<"-----------------------------------";
common->DealWithRequest("员工C", 1000);
return 0;
}