职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Handler.h:
#ifndef HANDLER_H_
#define HANDLER_H_
// 抽象处理者, 在C++中是抽象基类
class ApproverInterface {
public:
// 添加上级
virtual void setSuperior(ApproverInterface* superior) = 0;
// 处理票据申请, 参数是票据面额
virtual void handleRequest(double amount) = 0;
};
#endif // HANDLER_H_
BaseHandler.h:
#ifndef BASE_HANDLER_H_
#define BASE_HANDLER_H_
#include
#include "Handler.h"
class BaseApprover : public ApproverInterface {
public:
BaseApprover(double mpa, std::string n) : max_processible_amount_(mpa), name_(n), superior_(nullptr) {}
// 设置上级
void setSuperior(ApproverInterface* superior) {
superior_ = superior;
}
// 处理票据
void handleRequest(double amount) {
// 可处理时直接处理即可
if (amount <= max_processible_amount_) {
printf("%s处理了该票据, 票据面额:%f\n", name_.c_str(), amount);
return;
}
// 无法处理时移交给上级
if (superior_ != nullptr) {
printf("%s无权处理, 转交上级...\n", name_.c_str());
superior_->handleRequest(amount);
return;
}
// 最上级依然无法处理时报错
printf("无人有权限处理该票据, 票据金额:%lf\n", amount);
}
private:
double max_processible_amount_; // 可处理的最大面额
std::string name_;
ApproverInterface* superior_;
};
#endif // BASE_HANDLER_H_
ConcreteHandler.h:
#ifndef CONCRETE_HANDLER_H_
#define CONCRETE_HANDLER_H_
#include
#include
#include "BaseHandler.h"
// 具体处理者: 组长(仅处理面额<=10的票据)
class GroupLeader : public BaseApprover {
public:
explicit GroupLeader(std::string name) : BaseApprover(10, name) {}
};
// 具体处理者: 经理(仅处理面额<=100的票据)
class Manager : public BaseApprover {
public:
explicit Manager(std::string name) : BaseApprover(100, name) {}
};
// 具体处理者: 老板(仅处理面额<=1000的票据)
class Boss : public BaseApprover {
public:
explicit Boss(std::string name) : BaseApprover(1000, name) {}
};
#endif // CONCRETE_HANDLER_H_
main.cpp
#include "ConcreteHandler.h"
int main() {
system("chcp 65001");
// 请求处理者: 组长、经理和老板
GroupLeader* group_leader = new GroupLeader("张组长");
Manager* manager = new Manager("王经理");
Boss* boss = new Boss("李老板");
// 设置上级
group_leader->setSuperior(manager);
manager->setSuperior(boss);
// 不同面额的票据统一先交给组长审批
group_leader->handleRequest(8);
group_leader->handleRequest(88);
group_leader->handleRequest(888);
group_leader->handleRequest(8888);
delete group_leader;
delete manager;
delete boss;
system("pause");
return 0;
}
输出:
Active code page: 65001
张组长处理了该票据, 票据面额:8.000000
张组长无权处理, 转交上级...
王经理处理了该票据, 票据面额:88.000000
张组长无权处理, 转交上级...
王经理无权处理, 转交上级...
李老板处理了该票据, 票据面额:888.000000
张组长无权处理, 转交上级...
王经理无权处理, 转交上级...
无人有权限处理该票据, 票据金额:0.000000
Press any key to continue . . .