软件设计师2007 年11月下午试题6(C++语言 责任链模式)

【说明】

      已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批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 ;

}

原文地址:https://www.cnblogs.com/djcsch2001/p/2094973.html