模拟不同金额票据需要不同级别的领导审批流程:
- 金额0 ~ 10万含:Teamleader可处理,金额10 ~ 20万含:
- Supervisor可处理,金额20 ~ 50万含:
- Manager可处理,金额50 ~ 100万含:
- Boss可处理,金额超过100万,无人处理,
模拟缺点:请求没有一个明确的接收者,就不能保证它一定会被处理。
Handler(抽象处理者):AbstractHandler
ConcreteHandler(具体处理者):Teamleader、Supervisor、Manager、Boss
请求:Bill
1. 请求Bill
class Bill
{
public:
Bill(int id, const std::string &name, double account)
{
this->m_iID = id;
this->m_sName = name;
this->m_dAccount = account;
std::cout << "Bill 构造函数,id = " << this->m_iID << ",name = " << this->m_sName << ",account = " << this->m_dAccount << std::endl;
}
~Bill()
{
std::cout << "Bill 析构函数" << std::endl;
}
double getAccount()
{
return m_dAccount;
}
void showBill()
{
std::cout << "id = " << this->m_iID << ",name = " << this->m_sName << ",account = " << this->m_dAccount << std::endl;
}
private:
int m_iID;
std::string m_sName;
double m_dAccount;
};
2. Handler(抽象处理者)
class AbstractHandler
{
public:
explicit AbstractHandler(const std::string &name)
{
setName(name);
}
virtual ~AbstractHandler() = default;
//添加上级,职责链上的下一级处理者
void setNextHandler(AbstractHandler *nextHandler)
{
m_pNextHandler = nextHandler;
}
//处理请求
virtual void handleRequest(Bill *bill) = 0;
std::string getName() {
return m_sName;
}
protected:
AbstractHandler *m_pNextHandler;
private:
void setName(const std::string &name)
{
this->m_sName = name;
}
std::string m_sName;
};
3. ConcreteHandler(具体处理者)
//依次逐级处理
///第一级:TeamLeader///
class TeamLeader : public AbstractHandler
{
public:
explicit TeamLeader(const std::string &name)
:AbstractHandler(name)
{
std::cout << "TeamLeader 构造函数," << name << std::endl;
}
~TeamLeader()
{
std::cout << "TeamLeader 析构函数" << std::endl;
}
//处理请求
void handleRequest(Bill *bill) override
{
if (bill->getAccount() <= 10)
{
std::cout << "TeamLeader " << getName() << "处理了该票据,票据信息如下:" << std::endl;
bill->showBill();
}
else {
std::cout << "TeamLeader " << getName() << " 无权处理,转交上级" << std::endl;
if (nullptr == m_pNextHandler) {
std::cout << "票据无人处理,票据信息如下:" << std::endl;
bill->showBill();
}
else {
m_pNextHandler->handleRequest(bill);
}
}
}
private:
};
///第二级:Supervisor///
class Supervisor : public AbstractHandler
{
public:
explicit Supervisor(const std::string &name)
:AbstractHandler(name)
{
std::cout << "Supervisor 构造函数," << name << std::endl;
}
~Supervisor()
{
std::cout << "Supervisor 析构函数" << std::endl;
}
//处理请求
void handleRequest(Bill *bill) override
{
if (bill->getAccount() > 10 && bill->getAccount() <= 20)
{
std::cout << "Supervisor " << getName() << "处理了该票据,票据信息如下:" << std::endl;
bill->showBill();
}
else {
std::cout << "Supervisor " << getName() << " 无权处理,转交上级" << std::endl;
if (nullptr == m_pNextHandler) {
std::cout << "票据无人处理,票据信息如下:" << std::endl;
bill->showBill();
}
else {
m_pNextHandler->handleRequest(bill);
}
}
}
private:
};
///第三级:Manager///
class Manager : public AbstractHandler
{
public:
explicit Manager(const std::string &name)
:AbstractHandler(name)
{
std::cout << "Manager 构造函数," << name << std::endl;
}
~Manager()
{
std::cout << "Manager 析构函数" << std::endl;
}
//处理请求
void handleRequest(Bill *bill) override
{
if (bill->getAccount() > 20 && bill->getAccount() <= 50)
{
std::cout << "Manager " << getName() << "处理了该票据,票据信息如下:" << std::endl;
bill->showBill();
}
else {
std::cout << "Manager " << getName() << " 无权处理,转交上级" << std::endl;
if (nullptr == m_pNextHandler) {
std::cout << "票据无人处理,票据信息如下:" << std::endl;
bill->showBill();
}
else {
m_pNextHandler->handleRequest(bill);
}
}
}
private:
};
///第四级:Boss///
class Boss : public AbstractHandler
{
public:
explicit Boss(const std::string &name)
:AbstractHandler(name)
{
std::cout << "Boss 构造函数," << name << std::endl;
}
~Boss()
{
std::cout << "Boss 析构函数" << std::endl;
}
//处理请求
void handleRequest(Bill *bill) override
{
if (bill->getAccount() > 50 && bill->getAccount() <= 100)
{
std::cout << "Boss " << getName() << "处理了该票据,票据信息如下:" << std::endl;
bill->showBill();
}
else {
std::cout << "Boss " << getName() << " 无权处理,转交上级" << std::endl;
if (nullptr == m_pNextHandler) {
std::cout << "票据无人处理,票据信息如下:" << std::endl;
bill->showBill();
}
else {
m_pNextHandler->handleRequest(bill);
}
}
}
private:
};
4. 主函数
int main()
{
//请求处理者:张三, 李四, 王五, 赵六
AbstractHandler *level1, *level2, *level3, *level4;
level1 = new TeamLeader("张三");
level2 = new Supervisor("李四");
level3 = new Manager("王五");
level4 = new Boss("赵六");
std::cout << "=============== " << std::endl;
//建立职责链的工作是在客户端进行
level1->setNextHandler(level2);
level2->setNextHandler(level3);
level3->setNextHandler(level4);
//创建单据
Bill *bill1 = new Bill(1, "Bill_1", 8);
Bill *bill2 = new Bill(2, "Bill_2", 15);
Bill *bill3 = new Bill(3, "Bill_3", 99);
Bill *bill4 = new Bill(4, "Bill_4", 44);
Bill *bill5 = new Bill(5, "Bill_5", 150);
std::cout << "=============== " << std::endl;
//全部先交给 level1 TeamLeader 审批
level1->handleRequest(bill1);
std::cout << "=============== " << std::endl;
level1->handleRequest(bill2);
std::cout << "=============== " << std::endl;
level1->handleRequest(bill3);
std::cout << "=============== " << std::endl;
level1->handleRequest(bill4);
std::cout << "=============== " << std::endl;
level1->handleRequest(bill5);
std::cout << "=============== " << std::endl;
delete level1;
delete level2;
delete level3;
delete level4;
delete bill1;
delete bill2;
delete bill3;
delete bill4;
delete bill5;
getchar();
return 0;
}