【说明】
已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。
采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图6-1所示。
[C++代码]
#include <string>
#include <iostream>
using namespace std;
class PurchaseRequest {
public:
double Amount; // 一个采购的金额
int Number; // 采购单编号
string Purpose; // 采购目的
};
class Approver { // 审批者类
public:
Approver(){ successor = NULL; }
virtual void ProcessRequest(PurchaseRequest aRequest){
if (successor != NULL){ successor->ProcessRequest(aRequest); }
}
void SetSuccessor(Approver *aSuccesssor){ successor = aSuccesssor; }
private:
Approver::successor;
};
class Congress : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){
if (aRequest.Amount >= 500000){ /* 决定是否审批的代码省略 */ }
else Approver::ProcessRequest(aRequest);
}
};
class Director : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){ /* 此处代码省略 */ }
};
class President : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){ /* 此处代码省略 */ }
};
class VicePresident : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){ /* 此处代码省略 */ }
};
void main(){
Congress Meeting; VicePresident Sam; Director Larry ; President Tammy;
// 构造责任链
Meeting.SetSuccessor(NULL); Sam.SetSuccessor(&Tammy);
Tammy.SetSuccessor(&Meeting); Larry.SetSuccessor(&Sam);
PurchaseRequest aRequest; // 构造一采购审批请求
cin >> aRequest.Amount; // 输入采购请求的金额
Larry .ProcessRequest(aRequest); // 开始审批
return ;
}