(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

news2024/12/23 17:26:10

目录

1、责任链模式(Chain of Responsibility Pattern)含义

2、责任链模式的UML图学习

3、责任链模式的应用场景

4、责任链模式的优缺点

5、C++实现责任链模式的实例


1、责任链模式(Chain of Responsibility Pattern)含义

责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。【DP】

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。

每个接收者都包含对下一个接收者的引用,形成一个链条,当一个请求在链条上传递时,直到有一个接收者能够处理它为止。

2、责任链模式的UML图学习

责任链模式主要包含以下几个角色:

(1)抽象处理者(Handler):定义了处理请求的接口,并持有下一个处理者的引用。

(2)具体处理者(Concrete Handler):实现了抽象处理者的接口,具体处理请求的逻辑。如果自己无法处理请求,则将请求传递给下一个处理者。

3、责任链模式的应用场景

(1)有多个对象可以处理同一个请求,但具体处理者在运行时才能确定。

(2)需要动态地指定处理请求的顺序。

(3)发送者和接收者之间的关系应该被解耦。

4、责任链模式的优缺点

(1)优点:

        1)解耦发送者和接收者:请求发送者不需要知道具体的接收者,只需要将请求发送给第一个处理者即可,由处理者之间的关系来决定谁来处理请求。

        2)可扩展性:可以动态地增加或修改处理者,灵活地调整责任链的结构。

        3)可配置性:可以通过配置文件或其他方式来确定责任链的顺序和组成。

(2)缺点:

        1)请求可能无法被处理:如果没有合适的处理者来处理请求,请求可能会被忽略或丢失。

        2)性能影响:由于请求需要在责任链上传递,可能会影响系统的性能。

5、C++实现责任链模式的实例


#include <iostream>

// 抽象处理者
class Handler 
{
public:
    virtual void setNext(Handler* handler) = 0;
    virtual void handleRequest(int request) = 0;
};

// 具体处理者A
class ConcreteHandlerA : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 0 && request < 10) 
        {
            std::cout << "ConcreteHandlerA 处理请求:" << request << std::endl;
        }
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理者B
class ConcreteHandlerB : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 10 && request < 20) 
        {
            std::cout << "ConcreteHandlerB 处理请求:" << request << std::endl;
        } 
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理者C
class ConcreteHandlerC : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 20 && request < 30) 
        {
            std::cout << "ConcreteHandlerC 处理请求:" << request << std::endl;
        } 
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

int main() 
{
    // 创建具体处理者对象
    ConcreteHandlerA handlerA;
    ConcreteHandlerB handlerB;
    ConcreteHandlerC handlerC;

    // 设置责任链的顺序
    handlerA.setNext(&handlerB);
    handlerB.setNext(&handlerC);

    // 发送请求
    handlerA.handleRequest(5);
    handlerA.handleRequest(15);
    handlerA.handleRequest(25);

    return 0;
}

在上述示例中,抽象处理者(Handler)定义了处理请求的接口和设置下一个处理者的方法。具体处理者(ConcreteHandler)继承自抽象处理者,并实现了处理请求的逻辑。每个具体处理者都持有下一个处理者的引用,在处理请求时,如果满足条件,则处理请求;否则将请求传递给下一个处理者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch相关概念

1、概述 先说Elasticsearch的文件存储&#xff0c;Elasticsearch是面向文档型数据库&#xff0c;一条数据在这里就是一个文档&#xff0c;用JSON作为文档序列化的格式&#xff0c;比如下面这条用户数据&#xff1a; {"name" : "John","sex"…

论文写作中容易忽略的空格

持续更新吧&#xff0c;给自己提个醒&#xff0c;老是忘 1、数字和单位之间有一个四分之一空格&#xff0c;严格来说属于特殊符号&#xff0c;不知之间按空格键 应用场景&#xff1a; latex&#xff1a;语句$ 3\,m$ 可以实现&#xff0c; origin&#xff1a;网上的教程说可…

【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题&#xff0c;下面给大家介绍几种出现的问题以及解决方案&#xff1a; 1、ohpm not set up&#xff0c;报错截图如下&#xff1a; ​ 解决方案&…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题&#xff0c;较为深入的研究AWS WAF的相关规则。面对上千万的冲突&#xff0c;笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

angular 的 alert 的应用分析笔记

声明: 今天自己在写angular项目时 遇到alert问题 做个记录而已 不代表广大angular用户,如果多你有帮助那个就是凑巧!!!! 效果: 第一步: 第二步: 第三步: 是不是找不到,ModaUtils这个方法(因为我项目里有这个 文件 里边存了 alert和confirm等公共方法) 都说了是个人笔记,看看…

启动 WSL 2时报错“参考的对象类型不支持尝试的操作”

引言 启动 WSL 2时报错“参考的对象类型不支持尝试的操作”。 或者是&#xff1a;占位程序接收到错误数据 Error code: Wsl/Service/0x8007273d 一番搜索 发现说和代理有关。 解决方案&#xff1a; 最有用的解决方案看这个issue。 这里我给出我的总结方案&#xff1a; 首…

84-基于stm32单片机蔬菜大棚温湿度光照强度监测控制系统Proteus仿真+源码

资料编号&#xff1a;084 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏光照强度检测DHT11温湿度电机按键LED灯&#xff0c;制作一个温湿度采集、光照强度检测&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、湿度下限、光照强度下限值…

webrtc学习(五)-peerconnect_client

一.类关系图 conduct实现webrtc native api相关实现的调用&#xff0c;创建answer&#xff0c;创建offer&#xff0c;是最核心的&#xff0c;对于两个模块的调度&#xff1b;mainwindow主要用于界面的展示与调度。橙色模块主要是信令模块&#xff0c;所有的用户的登录登出交换信…

71 # 协商缓存的配置:通过内容

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…

Android系统-进程-AIDL

引言&#xff1a; Android系统的进程间通信&#xff0c;主要是Binder&#xff0c;AIDL就是一种Android接口定义语言&#xff0c;主要就是为了能更简单方便地实现跨进程通信。 概念与理解&#xff1a; AIDL&#xff1a;Android Interface Definition Language 序列化&#x…

NVIDIA Jetson 项目:机器人足球比赛

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 事实上&#xff0c;整个比赛都致力于这个想法。RoboCup小型联盟&#xff08;SSL&#xff09;视觉停电技术挑战赛鼓励团队“探索本地传感和处理&#xff0c;而不是非车载计算机和全球摄像机感知环境的…

非结构化数据库-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务&#xff0c;适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

Spring之AOP的特性

一. AOP简介 AOP是Aspect-Oriented Programming的缩写&#xff0c;即面向切面编程。利用oop思想&#xff0c;可以很好的处理业务流程&#xff0c;但是不能把系统中某些特定的重复性行为封装到模块中。例如&#xff0c;在很多业务中都需要记录操作日志&#xff0c;结果我们不得…

互联网的边缘与核心部分

边缘部分是用户直接使用&#xff0c;用来进行通信和资源共享。 核心部分由大量网络和连接网络的路由器组成。这部分是为边缘部分提供服务的。 边缘部分 处在互联网边缘的部分就是连接在互联网上的所有的主机。这些主机又称为端系统(end system)。 主机间的通信其实是进程间…

(三)行为型模式:3、解释器模式(Interpreter Pattern)(C++示例)

目录 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 2、解释器模式的UML图学习 3、解释器模式的应用场景 4、解释器模式的优缺点 5、C实现解释器模式的实例 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 解释器模式&#xff08;Interp…

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

一、WebSocket简介 HTML5规范在传统的web交互基础上为我们带来了众多的新特性&#xff0c;随着web技术被广泛用于web APP的开发&#xff0c;这些新特性得以推广和使用&#xff0c;而websocket作为一种新的web通信技术具有巨大意义。WebSocket是HTML5新增的协议&#xff0c;它的…

Linux Vm上部署Docker

创建ubutu虚拟机并远程连接&#xff0c; 参考 https://blog.csdn.net/m0_48468018/article/details/132267096 在终端中切换到root用户&#xff0c;并安装docker服务 2.1 切换到root用户 sudo su2.2 安装docker服务 , 参考 https://docs.docker.com/engine/install/ubuntu/ …

Dart 入门Hello world

1、下载Dart sdk IntelliJ & Android Studio | Dart 2、安装Dart 插件 3、安装后重启IDEA&#xff0c;创建Dart项目 4、创建dart文件 5、编写函数&#xff1a; void main() {print("Hello world"); } 6、运行&#xff1a; 官网学习&#xff1a;Dart 语言开发文…

Android漏洞之战——整体加壳原理和脱壳技巧详解

一、前言 为了帮助更加方便的进行漏洞挖掘工作&#xff0c;前面我们通过了几篇文章详解的给大家介绍了动态调试技术、过反调试技术、Hook技术、过反Hook技术、抓包技术等&#xff0c;掌握了这些可以很方便的开展App漏洞挖掘工作&#xff0c;而最后我们还需要掌握一定的脱壳技巧…

21.1 CSS 文字样式

1. 字体倾斜 font-style属性: 为文本设置字体样式.常用取值: normal: 正常显示文本. 快捷键: fstab. italic: 显示斜体文本. 快捷键: fsntab.<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>fo…