您的位置:首页 > 大数据 > 人工智能

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

2017-05-13 10:56 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职责链模式
相关文章推荐