设计模式-职责链模式

责任链模式Chain of Responsibility):

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


责任链模式的好处:

      当客户提交一个请求的时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。

      结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的后选择接收者的引用。

    可以随时地增加或者修改一个请求的结构。

    增强了给对象指派职责的灵活性。

    一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

职责链代码:

#pragma once
#include <iostream>
using namespace std;

//Handler类,定义一个处理请求的接口
class CHandler
{
protected:
	CHandler *m_pSuccessor;
public:
	CHandler(){m_pSuccessor = NULL;}
	void SetSuccessor(CHandler *pSuccessor)
	{
		m_pSuccessor = pSuccessor;
	}
	virtual void HandleRequest(const int &nRequest) = 0;
};

//ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,
//如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
//ConcreteHandler1,当请求数在0到10之间则有权利处理,否则转到下一位。
class CConcreteHandler1 : public CHandler
{
public:
	void HandleRequest(const int &nRequest)
	{
		if(nRequest >= 0 && nRequest < 10)
		{
			cout<<"CConcreteHandler1:"<<nRequest<<endl;
		}
		else if(m_pSuccessor != NULL)
		{
			m_pSuccessor->HandleRequest(nRequest);
		}
	}
};

//ConcreteHandler2,10-20。
class CConcreteHandler2 : public CHandler
{
public:
	void HandleRequest(const int &nRequest)
	{
		if(nRequest >= 10 && nRequest < 20)
		{
			cout<<"CConcreteHandler2:"<<nRequest<<endl;
		}
		else if(m_pSuccessor != NULL)
		{
			m_pSuccessor->HandleRequest(nRequest);
		}
	}
};

客户端使用代码:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include "ChainOfResponsibilityMode.h"
using namespace std;

int main()
{
	CHandler *pH1 = new CConcreteHandler1();
	CHandler *pH2 = new CConcreteHandler2();
	pH1->SetSuccessor(pH2);
	for(int i = 5 ;i <= 15 ;i ++)
	{
		pH1->HandleRequest(i);
	}
	delete pH1;
	delete pH2;
	return 0;
}
运行结果:


总结:
    和状态模式相比,它的条件可以相关,也可以所有都不相关;与组合模式相比,组合模式是有树形结构的,也就是是有等级关系的,而职责链模式则是一条线,没有什么结构。
原文地址:https://www.cnblogs.com/csnd/p/12062323.html