责任链模式(大话设计模式)C/C++版本
责任链模式
C++
#include #include using namespace std; // 请求类 struct Request { std::string requestType; // 请求类型 int number; // 该请求类型的数量 std::string requestContent; // 请求内容 }; // 抽象经理类 class Manager { private: std::string name; std::shared_ptr superior; // 管理者的上级 public: Manager(const std::string &strName) : name(strName) {} void SetSuperior(std::shared_ptr smartSuperior) // 设置管理者的上级 { superior = smartSuperior; } std::shared_ptr GetSuperior() const { return superior; } const std::string &GetName() const { return name; } virtual void RequestApplications(const Request &request) = 0; }; // 经理 经理所能有的权限就是可批准下属两天内的假期 class CommonManager : public Manager { public: CommonManager(const std::string &strName) : Manager(strName) {} virtual void RequestApplications(const Request &request) { if (request.requestType == "请假" && request.number std::cout std::shared_ptr superior-RequestApplications(request); } } } }; // 总监类 总监所能有的权限就是可批准下属一周内的假期 class Majordomo : public Manager { public: Majordomo(const std::string &strName) : Manager(strName) {} virtual void RequestApplications(const Request &request) { if (request.requestType == "请假" && request.number std::cout std::shared_ptr superior-RequestApplications(request); } } } }; // 总经理类 class GeneralManager : public Manager { public: GeneralManager(const std::string &strName) : Manager(strName) {} virtual void RequestApplications(const Request &request) { if (request.requestType == "请假" || (request.requestType == "加薪" && request.number std::cout std::cout std::cout std::shared_ptr int days; // 请假天数 } Request; typedef struct Manager { char *name; struct Manager *superior; void (*handleRequest)(struct Manager *self, Request *req); } Manager; void commonManagerHandleRequest(Manager *self, Request *req); void majordomoHandleRequest(Manager *self, Request *req); void generalManagerHandleRequest(Manager *self, Request *req); void commonManagerHandleRequest(Manager *self, Request *req) { if (req-days printf("%s:%s 数量 %d 被批准!\n", self-name, "小菜申请请假", req-days); } else if (self-superior) { self-superior-handleRequest(self-superior, req); } } void majordomoHandleRequest(Manager *self, Request *req) { if (req-days printf("%s:%s 数量 %d 被批准!\n", self-name, "小菜申请请假", req-days); } else if (self-superior) { self-superior-handleRequest(self-superior, req); } } void generalManagerHandleRequest(Manager *self, Request *req) { if (req-days printf("%s:%s 数量 %d 被批准!\n", self-name, "小菜申请请假", req-days); } else { printf("%s:%s 数量 %d 被拒绝!\n", self-name, "小菜申请请假", req-days); } } Manager *createManager(char *name, void (*handleRequest)(Manager *, Request *)) { Manager *manager = malloc(sizeof(Manager)); manager-name = name; manager-handleRequest = handleRequest; manager-superior = NULL; return manager; } void setSuperior(Manager *manager, Manager *superior) { manager-superior = superior; } void freeManager(Manager *manager) { free(manager); } int main() { Manager *manager = createManager("经理", commonManagerHandleRequest); Manager *major = createManager("总监", majordomoHandleRequest); Manager *generalManager = createManager("总经理", generalManagerHandleRequest); setSuperior(manager, major); setSuperior(major, generalManager); Request request; printf("员工申请请假结果:\n"); request.days = 1; manager-handleRequest(manager, &request); printf("\n员工申请请假结果:\n"); request.days = 4; manager-handleRequest(manager, &request); printf("\n员工申请请假结果:\n"); request.days = 10; manager-handleRequest(manager, &request); freeManager(manager); freeManager(major); freeManager(generalManager); return 0; }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。