大话设计模式--职责连模式 Chain of Resposibility -- C++实现实例
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++实现实例的更多相关文章
- 设计模式:职责链模式(Chain of Responsibility)
去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...
- C#设计模式——职责链模式(Chain Of Responsibility Pattern)
一.概述 在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使 ...
- 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)
模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- spring 事件驱动模型简介
事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): ...
- JavaScript跨浏览器事件处理
var EventUtil = { getEvent: function(event){ return event ? event : window.event; }, getTarget: func ...
- 大型网站技术学习-2. 云计算之OpenStack简述
上一章讲,虚拟化能够充分的利用资源,带来各种各样的好处. 当一个网站不大,只需要四五台机器就可以支撑的时候,可以采用手工的方式虚拟机,但是当网站流量很高,需要成千上万台机器的时候,那就非常不方便了. ...
- CocoaPods报错:The dependency `` is not used in any concrete target
内容提要: podfile升级之后到最新版本,pod里的内容必须明确指出所用第三方库的target,否则会出现The dependency `` is not used in any concrete ...
- IntelliJ idea——》创建tag、删除tag
https://blog.csdn.net/weixin_43453386/article/details/83857038
- android greendao3.0 多表关联关系讲解(转)
转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...
- PHP-Manual的学习----【语言参考】----【类型】-----【Boolean类型】
2017年7月20日15:41:26Boolean 布尔类型 1.这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 其实就是真假的问题.2.语法 要指定一个布尔值,使用 ...
- 七. PHP模式设计----运行及描写叙述任务
1. 解析器模式 //解析器内容类 //用于存放表达式的运算结果,并且能依据传入的表达式返回当初记录的结果 class InterpreterContext{ private $expressions ...
- CentOS升级Python2.6到Python2.7
个人博客:https://blog.sharedata.info/ 貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多的库都是要求用到2.7版本或以上,所以新系统要做 ...
- 【译】Java语言速览:StackOverflow
Java (请不要与 JavaScript 搞混) 是一种设计为与 Java 虚拟机 (JVM) 一起使用的多用途编程语言.一般称呼安装了相关工具使其可以开发并运行 Java 程序的电脑系统为 &qu ...