行为型模式之职责链模式(Chain of responsibility)

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

考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。例如,对话框中的按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定的帮助信息,那么帮助系统应该显示一个关于当前上下文的较一般的帮助信息—比如说,整个对话框。

3.举例

UML图很简单,主要是继承和聚合关系,下面以“要打仗了”为例,实现链式请求。

        在军队中,打仗是需要得到上级许可的,我们把现实的情况下战局的形势分为三级,分别以1-10个数字来代替,1-4属于一级战报,假设师长就可下命令;5-7属于二级战报,假设军长就可以下达命令;8-10属于三级战报,假设司令官可根据情况下达战争命令;大于10的需要向更高的层次汇报。具体代码如下:

       Handler处理请示的抽象接口,没有具体请示的实现,它是师长、军长、司令官的抽象类,用来设置具体请求类的下一继任者。

行为型模式之职责链模式(Chain of responsibility)_第1张图片

4.C++代码

#ifndef CHAIN_H
#define CHAIN_H
#include 
using std::cout;
using std::endl;
class CHandler{
protected:
	CHandler* m_Leader;
public:
	virtual void HandleRequest(int)=0;
	void SetHandler(CHandler* temp){
		m_Leader=temp;
	}
};
class CConcreteHandlerA : public CHandler{
public:
	virtual void HandleRequest(int iLevel){
		if(iLevel<=4){
			cout<<"It is A's job and its level is "<HandleRequest(iLevel);
		}
	}
};
class CConcreteHandlerB : public CHandler{
public:
	virtual void HandleRequest(int iLevel){
		if(iLevel<=7){
			cout<<"It is B's job and its level is "<HandleRequest(iLevel);
		}
	}
};
class CConcreteHandlerC : public CHandler{
public:
	virtual void HandleRequest(int iLevel){
		if(iLevel<=10){
			cout<<"It is C's job and its level is "<SetHandler(second);
	second->SetHandler(third);
	int arr[]={3,7,9,11};
	for(int i=0;iHandleRequest(arr[i]);
	}
	return 0;
}


你可能感兴趣的:(DesignPattern)