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

目录

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.hqwc.cn/news/80005.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)

存在逻辑删除的表字段上建立唯一索引的巧办法 首先&#xff0c;我们肯定是清楚地知道唯一键值逻辑删除位如果联合创建唯一索引的话&#xff0c;只能最多存在两条数据&#xff0c;无法满足不断删除新增的需求&#xff0c;所以需要一个巧妙的办法去实现有逻辑删除标志位的唯一索…

【Java 高阶】一文精通 Spring MVC - 基础概念(一)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理&#xff0c;可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能&#xff0c;使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…

(排序) 剑指 Offer 51. 数组中的逆序对 ——【Leetcode每日一题】

❓剑指 Offer 51. 数组中的逆序对 难度&#xff1a;困难 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff…

Docker关于下载,镜像配置,容器启动,停止,查看等基础操作

系列文章目录 文章目录 系列文章目录前言一、安装Docker并配置镜像加速器二、下载系统镜像&#xff08;Ubuntu、 centos&#xff09;三、基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09;四、容器的启动、 停止及重启…

STM32电源名词解释

STM32电源架构 常用名词 VCC Ccircuit 表示电路&#xff0c;即接入电路的电压。 VDD Ddevice 表示器件&#xff0c; 即器件内部的工作电压。 VSS Sseries 表示公共连接&#xff0c;通常指电路公共接地端电压。 VDDA Aanalog 表示模拟&#xff0c;是模拟电路部分的电源。主要为…

【C语言】C语言用数组算平均数,并输出大于平均数的数

题目 让用户输入一系列的正整数&#xff0c;最后输入“-1”表示输入结束&#xff0c;然后程序计算出这些数的平均数&#xff0c;最后输出输入数字的个数和平均数以及大于平均数的数 代码 #include<stdio.h> int main() {int x;double sum 0;int cnt 0;int number[100…

Linux服务——http协议及nginx服务

目录 一、HTTP协议 1、跨网络的主机间通讯方式 套接字相关的系统调用 2、HTTP协议访问网站的过程 3、http协议状态码分类 常见的http协议状态码 4、MIME 5、URL组成 6、HTTP协议版本 7、系统处理http请求的工作模式 8、apache与nginx的区别 二、I/O模型 I/O模型相关…

Docker常用操作命令(一)

Docker常用操作命令&#xff08;一&#xff09; 1、搜索镜像 docker search命令搜索存放在 Docker Hub中的镜像,此命令默认Docker会在Docker Hub中搜索镜像&#xff0c;可以配置了其他镜像仓库 [rootzch01 ~]# docker search centos NAME:镜像仓库名称DESCRIPTION:镜像仓库描…

测试框架pytest教程(5)运行失败用例-rerun failed tests

# content of test_50.py import pytestpytest.mark.parametrize("i", range(50)) def test_num(i):if i in (17, 25):pytest.fail("bad luck") 运行这个文件&#xff0c;2个失败&#xff0c;48个通过。 要运行上次失败的测试用例&#xff0c;可以使用--l…

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻&#xff1a; 乡村振兴战略下传统村落文化旅游设计 - 百度百科 https://baike.baidu.com/item/乡村振兴战略下传统村落文化旅游设计/62588677 概览 《乡村振兴战略下传统村落文化旅游…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…