C++责任链模式:Chain of Responsibility Pattern

2023-11-16

当你想要让一个以上的对象有机会能够处理某个请求的时候,就可以使用责任链模式。

责任链模式

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

通过责任链模式,你可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。链中的每个对象扮演处理器,并且有一个后继对象。如果它可以处理请求,就进行处理,否则把请求转发给后继者。

通过改变链内的成员或调动它们的次序,允许你动态地新增或删除责任。

案例:

假设我们要对考试分数(百分制)进行不同等级的处理,主要分为A、B、C、D、E五级形成一条责任链,各个成员按照分数区间处理该分数,如果不属于该成员的处理范围就传送给它的后继对象处理。

类图:

实现如下:

gradeHandler.h:

#ifndef GRADEHANDLER_H
#define GRADEHANDLER_H
#include <iostream>
using namespace std;

class GradeHandler {
public:
    virtual void handle(int grade) = 0;

protected:
    GradeHandler* m_successor;
};

class EHandler : public GradeHandler {
public:
    EHandler()
    {
        m_successor = NULL;
    }

    virtual void handle(int grade) override
    {
        cout << "E等级处理" << endl;
    }

};

class DHandler : public GradeHandler {
public:
    DHandler()
    {
        m_successor = new EHandler();
    }

    virtual void handle(int grade) override
    {
        if(grade <= 70 && grade > 60)
        {
            cout << "D等级处理" << endl;
        }
        else
        {
            m_successor->handle(grade);
        }
    }

};

class CHandler : public GradeHandler {
public:
    CHandler()
    {
        m_successor = new DHandler();
    }

    virtual void handle(int grade) override
    {
        if(grade <= 80 && grade > 70)
        {
            cout << "C等级处理" << endl;
        }
        else
        {
            m_successor->handle(grade);
        }
    }

};

class BHandler : public GradeHandler {
public:
    BHandler()
    {
        m_successor = new CHandler();
    }

    virtual void handle(int grade) override
    {
        if(grade <= 90 && grade > 80)
        {
            cout << "B等级处理" << endl;
        }
        else
        {
            m_successor->handle(grade);
        }
    }

};


class AHandler : public GradeHandler {
public:
    AHandler()
    {
        m_successor = new BHandler();
    }

    virtual void handle(int grade) override
    {
        if(grade <= 100 && grade > 90)
        {
            cout << "A等级处理" << endl;
        }
        else
        {
            m_successor->handle(grade);
        }
    }

};

#endif // GRADEHANDLER_H


main.cpp:

/*
 * 责任链模式
 *
 * date:2023-9-19
*/

#include "gradeHandler.h"

int main()
{
    cout << "请输入分数: ";
    int grade;
    cin >> grade;

    GradeHandler* gradeHandler = new AHandler();
    gradeHandler->handle(grade);
}

运行截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++责任链模式:Chain of Responsibility Pattern 的相关文章

  • 责任链模式

    责任链模式的定义与特点 责任链模式的定义 xff1a 使多个对象都有机会处理请求 xff0c 从而避免请求的发送者和接受者之间的耦合关系 xff0c 将这个对象连成一条链 xff0c 并沿着这条链传递该请求 xff0c 直到有一个对象处理他
  • C++设计模式13:责任链模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++复合模式:Compound Pattern

    模式通常被一起使用 并被组合在同一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式 以解决一般或重复发生的问题 注 是为了解决一般或重复发生的问题 而不是简单的认为使用了多个模式就是复合模式 绝不要为了使用模式而使用模式 具体问
  • C++外观模式:Facade Pattern

    装饰者 不改变接口 但加入责任 适配器 将一个接口转换成另一个接口 外观 让接口更简单 外观模式 将一个或数个类的复杂的一切都隐藏在背后 只显露出一个干净美好的外观 外观模式提供了一个统一的接口 用来访问子系统中的一群接口 外观模式定义了一
  • 设计模式之责任链模式(Chain)

    设计模式之责任链模式 Chain 本篇为 https github com iluwatar java design patterns tree master chain 阅读笔记 意图 避免请求发送者与接收者耦合在一起 让多个对象都有可能
  • C++建造者模式:Builder Pattern

    建造者模式又称生成者模式 该模式是一种创建型设计模式 能够分步骤创建复杂对象 该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象 建造者模式 Builder 所构建的对象一定是庞大而复杂的 并且一定是按照既定的制造工序将组件组
  • C++解释器模式:Interpreter Pattern

    当有语言要解释时 请使用解释器模式为语言创建解释器 解释器模式的核心是解释器类 在解释器模式中一般会定义两种解释器 终结符解释器 Terminal Expression Interpreter 终结符解释器用于解释语言中的基本单位 对应语法
  • C++状态模式:State Pattern

    状态模式 允许对象在其内部状态改变时改变它的行为 对象看起来好像修改类它的类 状态模式是有限状态机 Finite State Machine 的一种实现方式 我们都知道 http请求报文由请求行 请求头 请求空行和请求体四部分组成 服务器在
  • 责任链模式二

    本文以创建商品案例来讲解责任链模式 假设创建商品逻辑分为 1 创建商品 2 检验商品 3 保存商品 第二步中校验商品又分为多种情况 必填字段校验 规格校验 价格校验 库存校验等等 伪代码如下 public Result createProc
  • C++桥接模式:Bridge Pattern

    在现实生活中 某些类具有两个或多个维度的变化且这多个维度都可能需要后期扩展 如图形既可按形状分 又可按颜色分 如何设计类似于 Photoshop 这样的软件 能画不同形状和不同颜色的图形呢 如果用继承方式 m 种形状和 n 种颜色的图形就有
  • 代码精简10倍,责任链模式yyds

    目录 什么是责任链 使用场景 结语 前言最近 我让团队内一位成员写了一个导入功能 他使用了责任链模式 代码堆的非常多 bug 也多 没有达到我预期的效果 实际上 针对导入功能 我认为模版方法更合适 为此 隔壁团队也拿出我们的案例 进行了集体
  • 我去公司面试,人事经理面试没有过,我却把责任链模式学会了

    设计模式在开发当中是运用特别多的 设计模式就是参照我们日常生活特性 抽象出特性 从而某种实现达到具体要求 当然这当中一定是灵活转变 责任链正式拉开序幕 我去某某互联网公司去面试 好的方向的流程大致应该是 你上招聘软件投递简历 简历筛选通过
  • 责任链模式在项目中的引入使用

    责任链模式是一种设计模式 在责任链模式里 很多对象由每一个对象对其下家的引用而连接起来形成一条链 请求在这个链上传递 直到链上的某一个对象决定处理此请求 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求 这使得系统可以在不影响客
  • 设计模式-责任链模式(Java)

    设计模式 责任链模式 在极客学院的视频中学习了一种设计模式的方式 责任链模式 在博客园中发现了这篇文章 讲的很详细 就把它的一些内容转载过来了 本文中 我们将介绍设计模式中的行为型模式职责链模式 职责链模式的结果看上去很简单 但是也很复杂
  • Android中OkHttp源码阅读二(责任链模式)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 Android OkHttp源码阅读详解一 看OkHttp源码 发现OkHttp里面使用了责任链设计模式 所以才要学习责任链设计模式 小
  • Java设计模式(25):责任链模式(职责链模式)

    25 责任链模式 25 1 问题引入 采购需求 采购员需要采购一批教学器材 对器材采购金额有分级审批权限 如果金额小于等于3000元 由教学主任审批 0 lt x lt 3000 如果金额小于等于10000元 由院长审批 3000 lt x
  • C++代理模式:Proxy Pattern

    代理模式 为另一个对象提供一个替身或者占位符以控制对这个对象的访问 这样做的好处是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 代理需要做的 控制和管理访问 需要时可以扩展目标对象的功能 被代理的对象可以是远程的对
  • Java 责任链模式

    责任链模式 一 什么是责任链模式 二 责任链模式的优势和劣势 2 1 优势 2 2 劣势 三 示例 一 什么是责任链模式 责任链模式定义 为了避免请求发送者与多个请求处理者耦合在一起 于是将所有请求的处理者通过前一对象记住其下一个对象的引用
  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • C++抽象工厂模式:Abstract Factory Pattern

    抽象工厂模式是工厂方法模式的升级版本 工厂方法模式只有一个抽象产品类 而抽象工厂模式有多个 工厂方法模式的具体工厂类只能创建一个具体产品类的实例 而抽象工厂模式可以创建多个 案例 在上一章节工厂方法模式的基础上 将披萨的各种原料生产抽象成一

随机推荐

  • 把网页放到云服务器上,怎么把网页放到云服务器上

    怎么把网页放到云服务器上 内容精选 换一换 Linux操作系统云服务器的安全组出方向已按照元数据获取的前提条件进行配置 但是无法通过169 254 169 254获取元数据 在配置了静态IP的Linux系统云服务器中执行以下命令 ip ro
  • Jmeter参数化--后置处理器之正则表达式提取器

    在接口测试中 很多都需要依赖前一个请求的响应数据放到后一个请求的请求数据中来 在Jmeter中提供了正则表达式提取器来提取响应数据中的片段 本次使用的实例是微信公众号的客服发消息 在这个接口中 需要用到access token接口返回的to
  • 基于数据结构和C语言实现公交管理系统(含文档和代码)数据结构课程设计

    目录 第1章 课程设计内容及要求 第2章 需求分析 第3章 算法设计 3 1 设计思想 3 2 设计表示 第4章 系统调试及测试 含代码 4 1 功能截图 4 2 实现代码 第5章 课程设计心得 5 1 设计体会 5 2 系统改进 第6章
  • TCP/IP网络江湖——揭秘数据链路层的内功心法(数据链路层上篇:数据链路层的基础与本质)

    目录 0 引言 一 数据链路层的任务与功能 1 1 数据的封装与解封装 1 2 媒介访问控制 MAC
  • 如何快速找到期刊文献的期卷号

    在我们撰写论文时不论是查找下载期刊文献资料还是编辑参考文献都会需要知道该期刊论文的期卷号 那么 期刊论文的期卷号怎么找呢 下面小编就介绍几种论文期卷号的查找方法 注 文中所用的检索工具是 文献党下载器 一 最常见的就是论文的期卷号在参考文献
  • Presto查询Hive无数据解决方法

    1 是否使用了TEZ引擎 2 是否配置好了presto 如果是TEZ引擎 则加上一条配置即可 在hive properties中增加 hive recursive directories true
  • “Required request body is missing”请求体缺失

    昨天遇到一个报错 是这样的 有一个接口 后端和我说是get请求 带两个参数 在body里传递过去 我当时明明带着参数一起发给后端了 但是一直报错 显示请求体缺失 关键的是我用postman测试了 接口是通的 我就以为是前端的问题 就在那改传
  • 伪代码格式

    伪代码描述应该保持简洁 并且不应该超过一页的3 4 关键字和函数名字用粗体字 所有的变量使用小写字母 数组名称大写 元素采用A i 这样的表示形式 伪代码的意图是描述条件语句和循环语句 例如 伪代码计算两个最近点的距离 BruteForce
  • Web自动化 —— Selenium元素定位与防踩坑

    1 基本元素定位一 from selenium import webdriver from selenium webdriver chrome service import Service from selenium webdriver c
  • Mac系统编译Spring源码

    下载Spring源码 Spring源码托管在GitHub 点击进去之后 选择一个版本 然后下载 下载完成后 解压压缩包 然后打开spring framework 5 2 x gradle wrapper gradle wrapper pro
  • ARM学习系列 ---- ARM NEON

    ARM学习系列 ARM NEON 1 NEON概述 1 1 简介 NEON是指适用于Arm Cortex A系列处理器的一种高级SIMD 单指令多数据 扩展指令集 可执行并行数据处理 1 2 发展历史 arm v6 SIMD扩展 arm v
  • 计算器ajax实现代码,用JQuery写一个计算器

    因为觉得segment fault的markdown界面比CSDN漂亮一些 所以最近正在把博客迁移到这边来 这几天多发了两篇 作为一个学习中练手的小demo 选了一个计算器 原因大概只是因为早就想做 比较简单 又确实有很多地方不太清楚 所以
  • PAT 1011 A+B 和 C

    给定区间 2 31 2 31 内的 3 个整数 A B 和 C 请判断 A B 是否大于 C 注意本题数字的范围 是 2 31 2 31 因此要用long long 类型 刚开始用了int 类型 一直提示有错误 注意int 32位 可以包括
  • 开发规范-java代码注释及IDEA配置代码注释模板

    引 阿里巴巴开发规范 注释规约 强制 类 类属性 类方法的注释必须使用 Javadoc 规范 使用 内容 格式 不得使用 xxx 方式 说明 在 IDE 编辑窗口中 Javadoc 方式会提示相关注释 生成 Javadoc 可以正确输出相应
  • python正则表达式从字符串中提取数字的思路详解(转载)

    python从字符串中提取数字 使用正则表达式 用法如下 总结 匹配字符串的开始 匹配字符串的结尾 b 匹配一个单词的边界 d 匹配任意数字 D 匹配任意非数字字符 x 匹配一个可选的 x 字符 换言之 它匹配 1 次或者 0 次 x 字符
  • Unity - 无限循环列表

    效果和UI结构 效果 Tips 免费的视频转GIF网站 UI结构 父节点为一个Panel Panel的Vertical Layout Group方便快捷调整Panel下的Image子物体的位置 使用时取消组件 Image是列表的子物体 只有
  • CSS文字自动换行

    word break属性 normal 只在允许的断字点换行 浏览器保持默认处理 break word 在长单词或 URL 地址内部进行换行 white space属性 normal 默认 空白会被浏览器忽略 pre 空白会被浏览器保留 其
  • Java编程那些事儿88——文件操作之写文件

    Java编程那些事儿88 文件操作之写文件 陈跃峰 出自 http blog csdn net mailbomb 11 3 1 4 写文件 如前所述 将程序内部的数据输出到程序外部的数据源 应该使用IO类体系中的输出流 在实际的编程中 将程
  • MATLAB设计滤波器之新版filterDesigner使用

    一 引言 本篇内容主要介绍新版Matlab的滤波器设计filterDesigner工具的使用 并以设计两个带通滤波器为使用的例子 使用的MATLAB软件版本为MATLAB R2022a 二 filterDesigner设计滤波器 1 在命令
  • C++责任链模式:Chain of Responsibility Pattern

    当你想要让一个以上的对象有机会能够处理某个请求的时候 就可以使用责任链模式 责任链模式 将请求的发送和接收解耦 让多个接收对象都有机会处理这个请求 将这些接收对象串成一条链 并沿着这条链传递这个请求 直到链上的某个接收对象能够处理它为止 通