c++实现职责链模式--财务审批
内容:
某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。
代码:
#include<iostream> using namespace std; class PurchaseRequest { private: int money; public: PurchaseRequest(int money) { this->money=money; } void setMoney(int money) { this->money=money; } int getMoney(){ return this->money; } }; class Leader { protected: string name; Leader *successor; public: Leader(string name) { this->name=name; } void setSuccessor(Leader *successor) { this->successor=successor; } virtual void handleRequest(PurchaseRequest *request)=0; }; class Director:public Leader{ private: string name; public: Director(string name):Leader(name){} void handleRequest(PurchaseRequest *request) { // TODO Auto-generated method stub if(request->getMoney()<=1) { cout<<"主任"<<this->name<<"审批"<<request->getMoney()<<"万元的采购单"<<endl; } else { if(this->successor!=NULL) { this->successor->handleRequest(request); } } } }; class Manager : public Leader{ private: string name; public: Manager(string name):Leader(name){} void handleRequest(PurchaseRequest *request) { if(request->getMoney()<=5) { cout<<"部门经理"<<name<<"审批"<<request->getMoney()<<"万元的采购单"<<endl; } else { if(this->successor!=NULL) { this->successor->handleRequest(request); } } } }; class DeputyGeneralManager: public Leader{ private: string name; public: DeputyGeneralManager(string name):Leader(name){} void handleRequest(PurchaseRequest *request) { if(request->getMoney()<=10) { cout<<"副总经理"<<name<<"审批"<<request->getMoney()<<"万元的采购单"<<endl; } else { if(this->successor!=NULL) { this->successor->handleRequest(request); } } } }; class GeneralManager: public Leader{ private: string name; public: GeneralManager(string name):Leader(name){} void handleRequest(PurchaseRequest *request) { if(request->getMoney()<=20) { cout<<"总经理"<<name<<"审批"<<request->getMoney()<<"万元的采购单"<<endl; } else if(request->getMoney()>20) { cout<<"总经理"<<name<<"召开职工大会审批"<<request->getMoney()<<"万元的采购单"<<endl; } else { if(this->successor!=NULL) { this->successor->handleRequest(request); } } } }; int main(){ Leader *objDirector,*objManager,*objDeputyGeneralManager,*objGeneralManager; objDirector=new Director("张三"); objManager=new Manager("李四"); objDeputyGeneralManager=new DeputyGeneralManager("王五"); objGeneralManager=new GeneralManager("赵六"); objDirector->setSuccessor(objManager); objManager->setSuccessor(objDeputyGeneralManager); objDeputyGeneralManager->setSuccessor(objGeneralManager); PurchaseRequest *pr1=new PurchaseRequest(1); objDirector->handleRequest(pr1); PurchaseRequest *pr2=new PurchaseRequest(3); objDirector->handleRequest(pr2); PurchaseRequest *pr3=new PurchaseRequest(8); objDirector->handleRequest(pr3); PurchaseRequest *pr4=new PurchaseRequest(12); objDirector->handleRequest(pr4); PurchaseRequest *pr5=new PurchaseRequest(22); objDirector->handleRequest(pr5); return 0; }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!