Chain of Responsibility:责任链模式

      现有多个处理者。这些处理者可以处理不同的请求。这些处理者有等级关系,每个处理者都有更上级的处理者。对于最上级的处理者,可以没有上级。对于一个上级处理者,可以有多个下级处理者。

客户端发出了一个请求,请求被传递给一个最下级处理者。而该处理者无法处理该请求,于是将该请求发送给自己的上级。上级的处理者无法处理该请求,于是将该请求再度发往自己的上级……直到有某个处理者可以处理该请求。如果请求发送给最上级依然无法被处理,那么该请求就需要被抛出异常,或者有其他处理方式。

这一级一级的关系就像链条,故称之为责任链模式。

 

1.    定义请求

请求的定义是公开的,即必须为所有人可见,无论是客户还是处理者。

enum eRequest
{
	requestLevelA,
	requestLevelB,
	requestLevelC,
};
// 请求
class Request
{
public:
	eRequest _request;
};

2.    定义处理者基类

处理者基类规定了处理者的接口。

同时每个处理者存有上级的指针,当自身无法处理某个请求时,将该请求提交给自己的上级。

// 处理者
class Manager
{
public:
	//设置直接上级
	void setSuperior(Manager* superior) { _superior = superior; }
	//要求处理请求
	virtual void askForRequest(Request* request) = 0;
protected:
	Manager* _superior;
};

3.    定义处理者派生类

处理者派生类在请求处理函数中会对请求进行分析。若请求自身可以进行处理,那么处理;否则提交给自己的上级。

// 团队队长
class TeamLeader : public Manager
{
public:
	virtual void askForRequest(Request* request)
	{
		if (request->_request == requestLevelA)
		{
			处理请求
		}
		else
		{
			_superior->askForRequest(request);
		}
	};
};

// 总监
class Majordomo : public Manager
{
public:
	virtual void askForRequest(Request* request)
	{
		if (request->_request == requestLevelB)
		{
			处理请求
		}
		else
		{
			_superior->askForRequest(request);
		}
	};
};

// 老板
class Boss : public Manager
{
public:
	// 老板可以处理所有请求
	virtual void askForRequest(Request* request)
	{
		处理请求
	}
};

4.    用户使用

用户产生一个请求,然后将该请求提交给最低级的处理者即可。无论用户产生什么样的请求,都是如此。

void main()
{
	Manager* leader = new TeamLeader();
	Manager* major = new Majordomo();
	Boss* boss = new Boss();
	leader->setSuperior(major);
	major->setSuperior(boss);

	Request* rq = new Request();

	rq->_request = requestLevelA;
	leader->askForRequest(rq);

	rq->_request = requestLevelB;
	leader->askForRequest(rq);

	rq->_request = requestLevelC;
	leader->askForRequest(rq);
}
 

    责任链模式,一定要注意请求的配置,务必确保每一个请求都有某个级别的处理者可以进行处理。否则,当责任链走完,很可能请求没有被处理,那么就只能抛出异常,或使用通用的请求处理。

    一个责任链,可以是一条线,一棵树,或者一个环。对于环形的责任链,不存在最上级。这种情况下,请求必须可以被某个处理者处理,否则会死循环。

    下图是一个树形的责任链:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值