第二十四章-职责链模式

职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。

职责链的好处是当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。使得接受者和发送者都没有对方的明确消息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持他所有的候选接受者的引用。不过也要当心,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

图片

 

加薪代码

图片

#include <iostream>
#include<vector>
#include<string>
#include<ctime>

using namespace std;

class Request
{
private:
	string requestType;
	string requestContent;
	int number;
public:
	string getRequestType() { return requestType; }
	void setSequestType(string requestType_t) { requestType = requestType_t; }

	string getRequestContent() { return requestContent; }
	void setRequestContent(string requestContent_t) { requestContent = requestContent_t; }

	int getNumber() { return number; }
	void setNumber(int number_t) { number = number_t; }
};

class Manager
{
protected:
	string name;
	Manager* superior;

public:
	Manager(string name_t)
	{
		name = name_t;
	}

	void SetSuperior(Manager* superior_t)
	{
		superior = superior_t;
	}

	virtual void RequestApplications(Request* request) = 0;
};

class CommonManager :public Manager
{
public:
	CommonManager(string name_t)
		:Manager(name_t)
	{ }

	void RequestApplications(Request* request)
	{
		if (request->getRequestType() == "请假" && request->getNumber() <= 2)
		{
			cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
		}
		else
		{
			if (superior != nullptr)
				superior->RequestApplications(request);
		}
	}
};

class Majordomo :public Manager
{
public:
	Majordomo(string name_t)
		:Manager(name_t)
	{ }

	void RequestApplications(Request* request)
	{
		if (request->getRequestType() == "请假" && request->getNumber() <= 5)
		{
			cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
		}
		else
		{
			if (superior != nullptr)
				superior->RequestApplications(request);
		}
	}
};

class GeneralManager :public Manager
{
public:
	GeneralManager(string name_t)
		:Manager(name_t)
	{ }

	void RequestApplications(Request* request)
	{
		if (request->getRequestType() == "请假")
		{
			cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
		}
		else if (request->getRequestType() == "加薪" && request->getNumber() <= 500)
		{
			cout << request->getRequestType() << "数量" << request->getNumber() << " 被批准" << endl;
		}
		else if (request->getRequestType() == "加薪" && request->getNumber() > 500)
		{
			cout << request->getRequestType() << "数量" << request->getNumber() << " 再说吧" << endl;
		}
	}
};


int main()
{
	CommonManager* jingli = new CommonManager("经理");
	Majordomo* zongjian = new Majordomo("总监");
	GeneralManager* zongjingli = new GeneralManager("总经理");
	jingli->SetSuperior(zongjian);
	zongjian->SetSuperior(zongjingli);

	Request* request = new Request();
	request->setSequestType("请假");
	request->setRequestContent("小菜请假");
	request->setNumber(1);
	jingli->RequestApplications(request);


	system("pause");
	return 0;
}
posted @ 2019-12-17 09:53  微风吹过165  阅读(74)  评论(0编辑  收藏  举报