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

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

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

3.举例

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

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

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


4.C++代码

#ifndef CHAIN_H
#define CHAIN_H
#include <iostream>
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 "<<iLevel<<endl;
		}
		else{
			cout<<"It is out of A's job and its level is "<<iLevel<<endl;
			m_Leader->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 "<<iLevel<<endl;
		}
		else{
			cout<<"It is out of B's job and its level is "<<iLevel<<endl;
			m_Leader->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 "<<iLevel<<endl;
		}
		else{
			cout<<"It is out of C's job and its level is "<<iLevel<<endl;			
		}
	}
};
#endif


#include "chain.h"
int main(){
	CConcreteHandlerA* first=new CConcreteHandlerA;
	CConcreteHandlerB* second=new CConcreteHandlerB;
	CConcreteHandlerC* third=new CConcreteHandlerC;
	first->SetHandler(second);
	second->SetHandler(third);
	int arr[]={3,7,9,11};
	for(int i=0;i<sizeof(arr)/sizeof(int);i++){
		first->HandleRequest(arr[i]);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值