1.Chain of Responsibility模式:将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求(可能需要提供一个默认处理所有请求的类,例如MFC中的CwinApp类)。

2.Chain of Responsibility Pattern 结构图

3.实现

 #ifndef _HANDLE_H_
#define _HANDLE_H_ class Handle
{
public:
virtual ~Handle();
virtual void HandleRequest() = ;
void SetSuccessor(Handle* succ);
Handle* GetSuccessor(); protected:
Handle();
Handle(Handle* succ); private:
Handle* _succ;
}; class ConcreteHandleA:public Handle
{
public:
ConcreteHandleA();
~ConcreteHandleA();
ConcreteHandleA(Handle* succ);
void HandleRequest(); protected:
private:
}; class ConcreteHandleB:public Handle
{
public:
ConcreteHandleB();
~ConcreteHandleB();
ConcreteHandleB(Handle* succ);
void HandleRequest();
protected:
private:
}; #endif

Handle.h

 #include "Handle.h"
#include <iostream>
using namespace std; Handle::Handle()
{
_succ = ;
}
Handle::~Handle()
{
delete _succ;
}
Handle::Handle(Handle* succ)
{
this->_succ = succ;
}
void Handle::SetSuccessor(Handle* succ)
{
_succ = succ;
}
Handle* Handle::GetSuccessor()
{
return _succ;
}
void Handle::HandleRequest()
{ }
ConcreteHandleA::ConcreteHandleA()
{ }
ConcreteHandleA::ConcreteHandleA(Handle* succ):Handle(succ)
{ }
ConcreteHandleA::~ConcreteHandleA()
{ }
void ConcreteHandleA::HandleRequest()
{
if (this->GetSuccessor() != )
{
cout<<"ConcreteHandleA 我把处理权给后继节点....."<<endl;
this->GetSuccessor()->HandleRequest();
}
else
{
cout<<"ConcreteHandleA 没有后继了,我必须自己处理...."<<endl;
}
}
ConcreteHandleB::ConcreteHandleB()
{ }
ConcreteHandleB::ConcreteHandleB(Handle* succ):Handle(succ)
{ }
ConcreteHandleB::~ConcreteHandleB()
{ }
void ConcreteHandleB::HandleRequest()
{
if (this->GetSuccessor() != )
{
cout<<"ConcreteHandleB 我把处理权给后继节点....."<<endl;
this->GetSuccessor()->HandleRequest();
}
else
{
cout<<"ConcreteHandleB 没有后继了,我必须自己处理...."<<endl;
}
}

Handle.cpp

 #include "Handle.h"
#include <iostream>
using namespace std; int main(int argc,char* argv[])
{
Handle* h1 = new ConcreteHandleA();
Handle* h2 = new ConcreteHandleB();
h1->SetSuccessor(h2);
h1->HandleRequest();
return ;
}

main.cpp

最新文章

  1. Listener实现单态登陆
  2. 开启mysql慢查询
  3. Linux命令(14)文件和文件夹权限管理:chmod
  4. js常用函数收集
  5. TableViewCell自适应高度
  6. mongodb 入门笔记
  7. Java虚拟机内存区域堆(heap)的管理
  8. 汉诺塔问题C++实现
  9. sparse autoencoder
  10. linux(fedora) 下dvwa 建筑环境
  11. Java贪吃蛇感想
  12. JS_左边栏菜单
  13. C语言 &#183; 关联账户
  14. js事件冒泡和事件捕获详解
  15. jmeter接口自动化部署jenkins教程
  16. 解决Visio复制绘图时虚框变实框的问题
  17. jQuery(二):jQuery选择器
  18. Android ADB命令?这一次我再也不死记了!【简单说】
  19. JavaScript arguments对象详解
  20. 用JavaScript添加选择按钮的背景颜色和juqery添加选择按钮的背景色

热门文章

  1. 使用iframe实现提交表单不刷新页面
  2. 某考试 T3 bitboard
  3. 扩展欧几里得算法(exGCD)学习笔记
  4. 系统网站架构(淘宝、京东)&amp; 架构师能力
  5. thrift的使用及遇到的问题
  6. 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载一(PhoneGap中的API)
  7. XSS过滤
  8. 《后会无期》票房赶超《小时代3》 大数据解读韩寒VS四娘之争
  9. POJ 3211 Washing Clothes(01背包)
  10. freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析