1. 职责链模式: 使多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

当客户提交一个请求时,请求是沿着链传递直到有一个ConcreteHandler对象负责处理它,接收者和发送者都没有对方的明确信息,且链中的对象并不知道链的结构。

结果是职责链可以简化对象的互相连接,他们仅需一个指向其后继者的引用,而不需要保持它所有后继者的引用。

一个请求极有可能到了链的最末端还是得不到处理,或者没有正确配置而得不到处理,需要事先考虑全面。

实例:

handler.h handler.cpp

#ifndef HANDLER_H
#define HANDLER_H class Handler
{
public:
Handler();
~Handler();
void setSuccessor(Handler *successor);
void virtual handlerRequest(int request)=0; protected:
Handler *successor;
}; #endif // HANDLER_H
#include "handler.h"

Handler::Handler()
{
successor = 0;
} Handler::~Handler()
{
delete successor;
} void Handler::setSuccessor(Handler *successor)
{
this->successor = successor;
}

concretehandler1.h concretehandler1.cpp

#ifndef CONCRETEHANDLER1_H
#define CONCRETEHANDLER1_H #include "handler.h" class ConcreteHandler1 : public Handler
{
public:
ConcreteHandler1();
void handlerRequest(int request);
}; #endif // CONCRETEHANDLER1_H
#include "concretehandler1.h"
#include <stdio.h> ConcreteHandler1::ConcreteHandler1()
{
} void ConcreteHandler1::handlerRequest(int request)
{
if( request >=0 && request < 10 )
{
printf("ConcreteHandler1 handlerRequest\n");
}
else
{
if( successor!=0 )
{
printf("the next one handler\n");
successor->handlerRequest(request);
}
}
}

concretehandler2.h concretehandler2.cpp

#ifndef CONCRETEHANDLER2_H
#define CONCRETEHANDLER2_H #include "handler.h" class ConcreteHandler2 : public Handler
{
public:
ConcreteHandler2();
void handlerRequest(int request);
}; #endif // CONCRETEHANDLER2_H
#include "concretehandler2.h"
#include <stdio.h> ConcreteHandler2::ConcreteHandler2()
{
} void ConcreteHandler2::handlerRequest(int request)
{
if( request >=10 && request < 20 )
{
printf("ConcreteHandler2 handlerRequest\n");
}
else
{
if( successor!=0 )
{
printf("the next one handler\n");
successor->handlerRequest(request);
}
}
}

main.cpp

#include <iostream>
#include "concretehandler1.h"
#include "concretehandler2.h"
using namespace std; int main()
{
cout << "Chain_of_responsibility test!" << endl; Handler *h1 = new ConcreteHandler1();
Handler *h2 = new ConcreteHandler2();
h1->setSuccessor(h2);
h1->handlerRequest(15); return 0;
}

最新文章

  1. CentOS升级JDK
  2. Android菜鸟成长记13 -- 初识application
  3. 使用 TFDConnection 的 pooled 连接池
  4. 【hdu3579-Hello Kiki】拓展欧几里得-同余方程组
  5. 重构17-Extract&#160;Superclass(提取父类)
  6. javascript中ajax post实例详解
  7. SerialPort基本小例
  8. WPFDispatcher示例
  9. C++基础学习笔记----第十四课(new和malloc的区别、单例模式等深入)
  10. 详细解析Java中抽象类和接口的区别(转)
  11. Swift POP+MVVM
  12. Breathe me
  13. [翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置
  14. html页面设置&lt;span&gt;的高度和宽度
  15. MongoDB Notes
  16. Ubuntu下安装LNMP
  17. Numpy学习
  18. Java_EE面试题
  19. Akka-Cluster(0)- 分布式应用开发的一些想法
  20. grafana配置

热门文章

  1. Oracle 技术支持之现场优化的思维路径
  2. Android使用LinearViewLayout展示数据
  3. HDFS源码分析数据块复制监控线程ReplicationMonitor(二)
  4. 使用Percona监控插件监控MySQL
  5. 04 Memcached过期机制与删除机制
  6. ubuntu 解决更换源失败问题
  7. centos7.0 crontab 的yii计划任务没有执行
  8. Visual Studion 2013 HTML 如何打开设计图
  9. 【BZOJ2401】陶陶的难题I 欧拉函数+线性筛
  10. 九度OJ 1325:Battle Over Cities(城市间的战争) (并查集)