責任鏈模式

C++
#include <iostream>
#include <memory>using namespace std;
struct Request
{std::string requestType; int number; std::string requestContent;
};
class Manager
{
private:std::string name;std::shared_ptr<Manager> superior; public:Manager(const std::string &strName) : name(strName) {}void SetSuperior(std::shared_ptr<Manager> smartSuperior) {superior = smartSuperior;}std::shared_ptr<Manager> 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 <= 2){std::cout << "" << GetName().c_str() << ":" << request.requestContent.c_str() << " 數量 " << request.number << " 被批準!" << std::endl;}else{std::shared_ptr<Manager> superior = GetSuperior();if (superior != NULL) {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 <= 5){std::cout << "" << GetName().c_str() << ":" << request.requestContent.c_str() << " 數量 " << request.number << " 被批準!" << std::endl;}else{std::shared_ptr<Manager> superior = GetSuperior();if (superior != NULL) {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 <= 500)){std::cout << "" << GetName().c_str() << ":" << request.requestContent.c_str() << " 數量 " << request.number << " 被批準!" << std::endl;}else if (request.requestType == "加薪" && request.number > 500){std::cout << "" << GetName().c_str() << ":" << request.requestContent.c_str() << " 數量 " << request.number << " 被拒絕!" << std::endl;}else{std::cout << "" << GetName().c_str() << ":" << request.requestContent.c_str() << " 數量 " << request.number << " 無法處理!" << std::endl;}}
};int main()
{std::shared_ptr<Manager> manager = std::make_shared<CommonManager>("經理");std::shared_ptr<Manager> major = std::make_shared<Majordomo>("總監");std::shared_ptr<Manager> generalManager = std::make_shared<GeneralManager>("總經理");manager->SetSuperior(major);major->SetSuperior(generalManager);std::cout << "員工申請請假結果:" << std::endl;Request request;request.requestType = "請假";request.number = 1;request.requestContent = "小菜申請請假1天";manager->RequestApplications(request);std::cout << std::endl<< "員工申請加薪結果:" << std::endl;request.requestType = "請假";request.number = 4;request.requestContent = "小菜申請請假4天";manager->RequestApplications(request);std::cout << std::endl<< "員工申請加薪結果:" << std::endl;request.requestType = "加薪";request.number = 400;request.requestContent = "小菜申請加薪400";manager->RequestApplications(request);std::cout << std::endl<< "員工申請加薪結果:" << std::endl;request.requestType = "加薪";request.number = 1000;request.requestContent = "小菜申請加薪1000";manager->RequestApplications(request);system("pause");return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
typedef struct Request
{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 <= 2){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 <= 5){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 <= 10){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;
}