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;
}

大话设计模式--职责连模式 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. 安装MacOS到虚拟机

    [TOC] 系统版本历史 4. 升级系统到10.12.6版本 时间:2017年9月21日 15:58:55 大小:VMDK(7.63 GB) 变动: 升级系统到10.12.6版本 3. 降低内存到6G ...

  2. linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

    1 TCP简介 tcp是一种基于流的应用层协议,其“可靠的数据传输”实现的原理就是,“拥塞控制”的滑动窗口机制,该机制包含的算法主要有“慢启动”,“拥塞避免”,“快速重传”. 2 TCP socket ...

  3. Iwfu-GitHubclient使用

    Git/GitHub介绍 GitHub是著名的项目托管平台,有关Git和GitHub的介绍參考以下链接: Git介绍 url=OlagjwbaAdSJ2pjckgJCLBYd-LFFTDBriRnLt ...

  4. ubuntu安装中文man手册

    1.安装manpages-zh包 sudo apt-get install manpages-zh 2.修改manpath文件 执行如下命令: vi /etc/manpath.config %s+/u ...

  5. JQuery不能加载click事件的问题

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. 如何理解OOP?

    OOP (Object Oriented Programming)面向对象编程 1.它符合我们现在思考习惯 2.它让一些复杂的事情变得更加简单 3.它让操作者比那成了指挥者

  7. Rancher探秘二:安装Rancher

    环境准备 本次安装的是最新版本v2.1.5. 准备Linux环境,需要64位版本,在系统上安装docker,版本17.03.2 安装 docker安装, 登录到Linux服务器上,运行如下命令:sud ...

  8. 仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索keyword

    仿百度壁纸client(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager ...

  9. pip源提示“not a trusted or secure host” 解决

    问题:The repository located at mirrors.aliyun.com is not a trusted or secure host and is being ignored ...

  10. 多语言中的“默认语言”设置

    最近在搞一个多语言的东西,打算如果用户是中文环境就显示中文,其他任何非中文环境就显示英文.换句话说,把默认语言设置成英文. 不过因为VS是中文的,发现即使默认资源文件是英文(AppResource.r ...