2019-10-29 14:14:19 +00:00
|
|
|
|
#ifndef __CHAIN_OF_RESPONSIBILITY_PATTERN_H__
|
|
|
|
|
#define __CHAIN_OF_RESPONSIBILITY_PATTERN_H__
|
|
|
|
|
|
|
|
|
|
#include <mutex>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1>
|
|
|
|
|
class Bill
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Bill(){}
|
|
|
|
|
Bill(int iId, string iName, double iAccount){
|
|
|
|
|
id = iId;
|
|
|
|
|
name = iName;
|
|
|
|
|
account = iAccount;
|
|
|
|
|
}
|
|
|
|
|
double getAccount(){
|
|
|
|
|
return this->account;
|
|
|
|
|
}
|
|
|
|
|
void print(){
|
|
|
|
|
printf("\nID:\t%d\n", id);
|
|
|
|
|
printf("Name:\t%s\n", name.c_str());
|
|
|
|
|
printf("Account:\t%f\n", account);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
int id;
|
|
|
|
|
string name;
|
|
|
|
|
double account;
|
|
|
|
|
};
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
class Approver
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Approver(){}
|
|
|
|
|
Approver(string iName){
|
|
|
|
|
setName(iName);
|
|
|
|
|
}
|
2021-04-04 13:09:08 +00:00
|
|
|
|
virtual ~Approver(){}
|
2019-10-29 14:14:19 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>
|
|
|
|
|
void setSuperior(Approver *iSuperior){
|
|
|
|
|
this->superior = iSuperior;
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
virtual void handleRequest(Bill*) = 0;
|
|
|
|
|
string getName(){
|
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
void setName(string iName){
|
|
|
|
|
name = iName;
|
|
|
|
|
}
|
|
|
|
|
protected:
|
|
|
|
|
Approver *superior;
|
|
|
|
|
private:
|
|
|
|
|
string name;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>崦<EFBFBD><E5B4A6><EFBFBD>ߣ<EFBFBD><DFA3>鳤
|
|
|
|
|
class GroupLeader :public Approver
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
GroupLeader(){}
|
|
|
|
|
GroupLeader(string iName){
|
|
|
|
|
setName(iName);
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void handleRequest(Bill *bill){
|
|
|
|
|
if (bill->getAccount() < 10){
|
|
|
|
|
printf("<EFBFBD>鳤 %s <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>Ʊ<EFBFBD>ݣ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>",this->getName().c_str());
|
|
|
|
|
bill->print();
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
printf("<EFBFBD>鳤<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|
|
|
|
this->superior->handleRequest(bill);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>崦<EFBFBD><E5B4A6><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
class Head :public Approver
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Head(){}
|
|
|
|
|
Head(string iName){
|
|
|
|
|
setName(iName);
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void handleRequest(Bill *bill){
|
|
|
|
|
if (bill->getAccount() >= 10 && bill->getAccount()<30){
|
|
|
|
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>Ʊ<EFBFBD>ݣ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>", this->getName().c_str());
|
|
|
|
|
bill->print();
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|
|
|
|
this->superior->handleRequest(bill);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>崦<EFBFBD><E5B4A6><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
class Manager :public Approver
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Manager(){}
|
|
|
|
|
Manager(string iName){
|
|
|
|
|
setName(iName);
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void handleRequest(Bill *bill){
|
|
|
|
|
if (bill->getAccount() >= 30 && bill->getAccount()<60){
|
|
|
|
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>Ʊ<EFBFBD>ݣ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>", this->getName().c_str());
|
|
|
|
|
bill->print();
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|
|
|
|
this->superior->handleRequest(bill);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>崦<EFBFBD><E5B4A6><EFBFBD>ߣ<EFBFBD><DFA3>ϰ<EFBFBD>
|
|
|
|
|
class Boss :public Approver
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Boss(){}
|
|
|
|
|
Boss(string iName){
|
|
|
|
|
setName(iName);
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void handleRequest(Bill *bill){
|
|
|
|
|
printf("<EFBFBD>ϰ<EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>Ʊ<EFBFBD>ݣ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>", this->getName().c_str());
|
|
|
|
|
bill->print();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif //__CHAIN_OF_RESPONSIBILITY_PATTERN_H__
|