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

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

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

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

实例:

handler.h handler.cpp

  1. #ifndef HANDLER_H
  2. #define HANDLER_H
  3.  
  4. class Handler
  5. {
  6. public:
  7. Handler();
  8. ~Handler();
  9. void setSuccessor(Handler *successor);
  10. void virtual handlerRequest(int request)=0;
  11.  
  12. protected:
  13. Handler *successor;
  14. };
  15.  
  16. #endif // HANDLER_H
  1. #include "handler.h"
  2.  
  3. Handler::Handler()
  4. {
  5. successor = 0;
  6. }
  7.  
  8. Handler::~Handler()
  9. {
  10. delete successor;
  11. }
  12.  
  13. void Handler::setSuccessor(Handler *successor)
  14. {
  15. this->successor = successor;
  16. }

concretehandler1.h concretehandler1.cpp

  1. #ifndef CONCRETEHANDLER1_H
  2. #define CONCRETEHANDLER1_H
  3.  
  4. #include "handler.h"
  5.  
  6. class ConcreteHandler1 : public Handler
  7. {
  8. public:
  9. ConcreteHandler1();
  10. void handlerRequest(int request);
  11. };
  12.  
  13. #endif // CONCRETEHANDLER1_H
  1. #include "concretehandler1.h"
  2. #include <stdio.h>
  3.  
  4. ConcreteHandler1::ConcreteHandler1()
  5. {
  6. }
  7.  
  8. void ConcreteHandler1::handlerRequest(int request)
  9. {
  10. if( request >=0 && request < 10 )
  11. {
  12. printf("ConcreteHandler1 handlerRequest\n");
  13. }
  14. else
  15. {
  16. if( successor!=0 )
  17. {
  18. printf("the next one handler\n");
  19. successor->handlerRequest(request);
  20. }
  21. }
  22. }

concretehandler2.h concretehandler2.cpp

  1. #ifndef CONCRETEHANDLER2_H
  2. #define CONCRETEHANDLER2_H
  3.  
  4. #include "handler.h"
  5.  
  6. class ConcreteHandler2 : public Handler
  7. {
  8. public:
  9. ConcreteHandler2();
  10. void handlerRequest(int request);
  11. };
  12.  
  13. #endif // CONCRETEHANDLER2_H
  1. #include "concretehandler2.h"
  2. #include <stdio.h>
  3.  
  4. ConcreteHandler2::ConcreteHandler2()
  5. {
  6. }
  7.  
  8. void ConcreteHandler2::handlerRequest(int request)
  9. {
  10. if( request >=10 && request < 20 )
  11. {
  12. printf("ConcreteHandler2 handlerRequest\n");
  13. }
  14. else
  15. {
  16. if( successor!=0 )
  17. {
  18. printf("the next one handler\n");
  19. successor->handlerRequest(request);
  20. }
  21. }
  22. }

main.cpp

  1. #include <iostream>
  2. #include "concretehandler1.h"
  3. #include "concretehandler2.h"
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. cout << "Chain_of_responsibility test!" << endl;
  9.  
  10. Handler *h1 = new ConcreteHandler1();
  11. Handler *h2 = new ConcreteHandler2();
  12. h1->setSuccessor(h2);
  13. h1->handlerRequest(15);
  14.  
  15. return 0;
  16. }

大话设计模式--职责连模式 Chain of Resposibility -- C++实现实例的更多相关文章

  1. 设计模式:职责链模式(Chain of Responsibility)

    去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...

  2. C#设计模式——职责链模式(Chain Of Responsibility Pattern)

    一.概述 在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使 ...

  3. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  4. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  5. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  6. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  7. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  8. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  9. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. STM32 寄存器库和固件库

    寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制 ...

  2. Codeforces Round #275 (Div. 2) C

    题目传送门:http://codeforces.com/contest/483/problem/C 题意分析:题目意思没啥好说的. 去搞排列列举必须TLE.那么就想到构造. 1.n.2.n-1.3.n ...

  3. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  4. Linux高并发应用类型对系统内核的优化

    Linux操作系统内核参数优化 net.ipv4.tcp_max_tw_buckets = net.ipv4.ip_local_port_range = net.ipv4.tcp_tw_recycle ...

  5. 嵌入式开发之simulation--- 双目移动dsp机器人

    http://foundy.blog.163.com/blog/static/263383442014112391130207/

  6. 什么是scale up和scale out

    Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...

  7. PHP中foreach用法详细讲解

    1.foreach是什么? foreach是PHP的一种语法结构,其实就是一个工具,(工具:就是工作的时候用到的器具),那么在程序开发过程中,为了达到程序效果,就用到了foreach. 2.如何用? ...

  8. 优化tomcat启动速度

    1.去掉不需要的jar包,这样tomcat在启动时就可以少加载jar包里面的class文件. 2.跳过一些与TLD files.注解.网络碎片无关的jar包,通过在conf/catalina.prop ...

  9. Action三种编写方式

    1.     创建普通类不实现接口与继承类 2.     实现Action接口 3.     继承ActionSupport类(常用)

  10. 15.Django添加一个功能模块的步骤(和SpringMVC类比)

    这里介绍如何在Django里新建一个模块,这个例子还是最简单的例子 通过浏览器访问 http://localhost:8000/hello/然后返回一个欢迎页 我是做java web出身的,这里用py ...