职责链模式(C++实现)

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

 

当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。职责链可以简化对象之间的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。

#include <iostream>
#include <string>

using namespace std;

class Request
{
private:
	string requestType;
	string requestContent;
	int number;

public:
	void SetRequestType( string type )
	{
		requestType = type;
	}
	string GetRequestType()
	{
		return requestType;
	}

	void SetRequestContent( string content )
	{
		requestContent = content;
	}
	string GetRequestContent()
	{
		return requestContent;
	}

	void SetNumber( int number )
	{
		this->number = number;
	}
	int GetNumber()
	{
		return number;
	}

};

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

public:
	Manager( string name )
	{
		this->name = name;
	}

	void SetSuperior( Manager* superior )
	{
		this->superior = superior;
	}

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

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

	void RequestApplications( Request& request )
	{
		if( request.GetRequestType() == "请假" && request.GetNumber() <= 2 )
		{
			cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
		}
		else
		{
			if( superior != NULL )
				superior->RequestApplications( request );
		}
	}
};

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

	void RequestApplications( Request& request )
	{
		if( request.GetRequestType() == "请假" && request.GetNumber() <= 5 )
		{
			cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
		}
		else
		{
			if( superior != NULL )
			{
				superior->RequestApplications( request );
			}
		}
	}

};

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

	void RequestApplications( Request& request )
	{
		if( request.GetRequestType() == "请假")
		{
			cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
		}
		else if( request.GetRequestType() == "加薪" && request.GetNumber() <= 500 )
		{
			cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
		}
		else if( request.GetRequestType() == "加薪" && request.GetNumber() > 500 )
		{
			cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 再说吧"<<endl;
		}
	}

};

int main()
{
	CommonManager jinli("金利");
	Majordomo zongjian("宗剑");
	GeneralManager zhongjingli("钟精励");

	jinli.SetSuperior( &zongjian );
	zongjian.SetSuperior( &zhongjingli );

	Request request;
	request.SetRequestType("请假");
	request.SetRequestContent("小菜请假");
	request.SetNumber( 1 );
	jinli.RequestApplications( request );

	Request request2;
	request2.SetRequestType("请假");
	request2.SetRequestContent("小菜请假");
	request2.SetNumber( 4 );
	jinli.RequestApplications( request2 );

	Request request3;
	request3.SetRequestType("加薪");
	request3.SetRequestContent("小菜请求加薪");
	request3.SetNumber( 500 );
	jinli.RequestApplications( request3 );

	Request request4;
	request4.SetRequestType("加薪");
	request4.SetRequestContent("小菜请求加薪");
	request4.SetNumber( 1000 );
	jinli.RequestApplications( request4 );


	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值