行为型模式之职责链模式(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++代码
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
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; }
相关文章推荐
- 设计模式(十八)职责链模式(Chain of Responsibility)-行为型
- 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)
- Chain of Responsibility(职责链)——对象行为型模式
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
- C#面向对象设计模式纵横谈 学习笔记20 Chain of Responsibility职责链模式(行为型模式)
- [导入]C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式.zip(8.18 MB)
- 职责链模式(Chain of Responsibility)(对象行为型)
- Chain of Responsibility(职责链)——对象行为型模式
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
- 设计模式深入学习--Chain of Responsibility 职责链模式职责链模式(行为型模式)
- 二十、 Chain of Responsibility 职责链(行为型模式)
- 设计模式24---设计模式之职责链模式(Chain of Responsibility)(行为型)
- 十三、职责链模式Chain of Responsibility(行为型)
- 设计模式之职责链(chain of responsibility)---对象行为型模式
- 十四、职责链(Chain of Responsibility)模式--行为型模式(Behavioral Pattern)
- 设计模式十四:chain of responsibility(职责连模式)——对象行为型模式
- 职责链模式(Chain of Responsibility)(对象行为型)
- 行为型模式-职责链chain of responsibility
- 行为型模式之职责链CHAIN OF RESPONSIBILITY
- Chain Of Responsibility(职责连)-对象行为型模式