Chain of Responsibility责任链方式(C++责任链模式)

Chain of Responsibility责任链模式(C++责任链模式)

Chainof Responsibility责任链模式:相当于MFC,windows程序设计窗口中的消息机制这类。

MFC中,消息是通过一个向上递交的方式进行处理,例如一个WM_COMMAND消息的处理流程可能为:
1) MDI主窗口(CMDIFrameWnd)收到命令消息WM_COMMAND,其ID位ID_×××;
2) MDI主窗口将消息传给当前活动的MDI子窗口(CMDIChildWnd);
3) MDI子窗口给自己的子窗口(View)一个处理机会,将消息交给View;
4) View检查自己Message Map;
5) 如果View没有发现处理该消息的程序,则将该消息传给其对应的Document对象;否则View处理,消息流程结束。
6) Document检查自己Message Map,如果没有该消息的处理程序,则将该消息传给其对象的DocumentTemplate处理;否则自己处理,消息流程结束;
7) 如果在6)中消息没有得到处理,则将消息返回给View;
8) View再传回给MDI子窗口;
9) MDI子窗口将该消息传给CwinApp对象,CwinApp为所有无主的消息提供了处理。

MFC提供了消息的处理的链式处理策略,处理消息的请求将沿着预先定义好的路径依
次进行处理。消息的发送者并不知道该消息最后是由那个具体对象处理的,当然它也无须也不想知道,但是结构是该消息被某个对象处理了,或者一直到一个终极的对象进行处理了。
Chain of Responsibility模式描述其实就是这样一类问题将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求(可能需要提供一个默认处理所有请求的类,例如MFC中的CwinApp类)。

 

//////////////////////////////////////////////////////////////////////////
// author:Jeson Yang
// date:2014.12.9
// filename:main.cpp
//////////////////////////////////////////////////////////////////////////
#include<iostream>
using namespace std;
class Handles
{
public:
	virtual ~Handles(){}
	virtual void HandlesRequest()=0;
	void SetSussessor(Handles* succ){m_succ=succ;};
	Handles* GetSussessor(){return m_succ;}
protected:
	Handles(){m_succ=0;}
	Handles(Handles* succ){m_succ=succ;}
private:
	Handles* m_succ;
};


class ConcreteHandleA:public Handles
{
public:
	ConcreteHandleA(){};
	~ConcreteHandleA(){};
	ConcreteHandleA(Handles* succ):Handles(succ){}
	void HandlesRequest()
	{
		if(this->GetSussessor()!=0)
		{
			cout<<"To Next Succ"<<endl;
			this->GetSussessor()->HandlesRequest();
		}
		else
		{
			cout<<"A next no more,Let do it myself"<<endl;
		}
	}
};

class ConcreteHandleB:public Handles
{
public:
	ConcreteHandleB(){};
	~ConcreteHandleB(){};
	ConcreteHandleB(Handles* succ):Handles(succ){}
	void HandlesRequest()
	{
		if(this->GetSussessor()!=0)
		{
			cout<<"To Next Succ"<<endl;
			this->GetSussessor()->HandlesRequest();
		}
		else
		{
			cout<<"B next no more,Let do it myself"<<endl;
		}
	}
};


void main()
{
	Handles* h1=new ConcreteHandleA();
	Handles* h2=new ConcreteHandleB();
	h1->SetSussessor(h2);
	h1->HandlesRequest();

	delete h2;
	delete h1;
}