设计模式 -职责链模式

定义

职责链模式是一种对象行为型模式,它常用于处理具有多个处理者的请求。在一个软件系统中,当一个请求可以被多个对象处理时,这些对象可以组织成一条链,并按照这个链传递请求,从而实现了请求发送者和请求处理者之间的解耦。

职责链模式的主要角色包括:

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

通过使用职责链模式,可以降低对象之间的耦合度,使得一个对象无需知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。同时,增强了系统的可扩展性,可以根据需要增加新的请求处理类,满足开闭原则。此外,职责链模式还可以实现责任分担。

实现举例

是的,C++可以实现职责链模式。以下是一个简单的示例代码:

#include <iostream>
#include <list>class Handler {
public:virtual void handleRequest() = 0;virtual Handler* getSuccessor() = 0;
};class ConcreteHandler1 : public Handler {
public:void handleRequest() override {if (requestType == "request1") {// 处理类型为"request1"的请求std::cout << "ConcreteHandler1 handles request1" << std::endl;} else {// 将请求传递给下一个处理者if (successor != nullptr) {successor->handleRequest();} else {std::cout << "No successor to handle request" << std::endl;}}}Handler* getSuccessor() override {return successor;}private:std::string requestType; // 请求类型,这里只是一个示例,具体实现中可能需要更复杂的数据结构或参数来标识请求类型和数据等。Handler* successor; // 下一个处理者的指针,默认为nullptr。
};class ConcreteHandler2 : public Handler {
public:void handleRequest() override {if (requestType == "request2") {// 处理类型为"request2"的请求std::cout << "ConcreteHandler2 handles request2" << std::endl;} else {// 将请求传递给下一个处理者(默认为ConcreteHandler1)if (successor != nullptr) {successor->handleRequest();} else {std::cout << "No successor to handle request" << std::endl;}}}Handler* getSuccessor() override {return successor;}private:std::string requestType; // 请求类型,这里只是一个示例,具体实现中可能需要更复杂的数据结构或参数来标识请求类型和数据等。Handler* successor; // 下一个处理者的指针,默认为nullptr。
};int main() {ConcreteHandler1 handler1; // 创建处理者对象,作为链头的处理者。ConcreteHandler2 handler2; // 创建处理者对象,作为链尾的处理者。handler1.successor = &handler2; // 将handler2设置为handler1的后继者。handler2.successor = nullptr; // handler2没有后继者,链在此结束。std::list<Handler*> handlers; // 创建一个处理者链表,用于存储处理者对象。handlers.push_back(&handler1); // 将handler1添加到链表末尾。return 0;
}

总结

职责链模式的主要特性包括:

  1. 请求的发送者和接收者实现了解耦。请求的发送者不需要知道接收者是谁以及如何处理请求,而是将请求传递给链上的一个处理者进行处理。
  2. 增强了系统的灵活性。可以通过添加或修改处理者对象来改变系统的处理结构,而不需要修改原有系统。
  3. 每个处理者可以单纯处理请求,或者将请求传递给后继者。每个处理者的行为可以根据需要进行选择。
  4. 在客户端创建链时,只需要知道链头的处理者对象,不需要知道链上的其他处理者对象,从而简化了对象的连接方式。
  5. 职责链模式也存在一些问题,例如一个请求可能到链的末端都得不到处理,或者因为没有正确的配置而得不到处理。因此,在设计时需要考虑这些情况。

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

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

相关文章

Java JDK 和 JRE 有什么区别

Java JDK 和 JRE 有什么区别 在Java开发中&#xff0c;Java Development Kit&#xff08;JDK&#xff09;和Java Runtime Environment&#xff08;JRE&#xff09;是两个关键的概念&#xff0c;它们之间存在一些区别。 Java Development Kit (JDK)&#xff1a; 用途&#xff1…

HTML h1和h2的三点区别

HTML中的h1和h2 HTML中&#xff0c;h1和h2都是标题元素&#xff0c;二者的关系可以说是递进或递减的关系&#xff0c;如何理解呢&#xff1f;&#xff0c;HTML文档定义的网页一般会被设计成具有一定的结构&#xff0c;而且通常是具有清晰的结构&#xff0c;比如都具有一个主题…

vmware下ubuntu 22.04从主机复制出错

原因分析 vmware下ubuntu 22.04从主机复制出错&#xff0c;如果确定安装了vmware-tools而且重装之后无法解决&#xff0c;大概率是因为vmware-tools和wayland冲突&#xff08;ubuntu 22.04默认使用wayland而不是xorg&#xff09; wayland vs xorg Xorg是X窗口系统的最新版本&…

MySQL-函数

一、统计函数 CREATE TABLE student (id INT NOT NULL DEFAULT 1,name varchar(20) not null default ,chinese float not null default 0.0,english float not null default 0.0,math float not null default 0.0 );insert into student values (1,曹操,77,89,85);insert int…

Vue3中watch和watchEffect的区别及使用场景

Vue3 中 watch 和 watchEffec t的区别及使用场景 在Vue 3中&#xff0c;watch和watchEffect是用于监听响应式数据变化的两个重要API。它们在使用方式和功能上有一些区别&#xff0c;下面将从不同方面进行比较。 1. 使用方式 watch的使用方式是通过在组件选项中定义一个watch…

centos7上源码安装mysql--运维高级

第一步,安装必要的依赖: yum install -y cmake ncurses-devel bison gcc gcc-c make unzip libaio numactl 第二步,创建mysql用户和组: wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18.tar.gz tar zxvf mysql-5.7.18.tar.gz 第三步,下载MySQL 5.7.18 源码…

postgres在docker中使用

记录个人开发过程中postgres在docker中的使用&#xff0c;以便后续查看。 Dockerfile 个人是在M1电脑上开发&#xff0c;所以platform使用linux/amd64来兼容amd芯片。 FROM --platformlinux/amd64 postgres:16.1-alpine COPY ./poetrydb.sql /docker-entrypoint-initdb.d/po…

Jenkins 如何查看已经记录登录服务器的凭证密码

文章目录 一、背景描述二、解决方案一&#xff08;查看所有账号密码&#xff09;三、解决方案二&#xff08;查询指定账号密码&#xff09; 一、背景描述 在日常的开发过程中&#xff0c;有时候会出现忘记开发、测试服务器的登录密码的情况。此时恰巧 Jenkins 上记录了登录该主…

【笔记】windows+pytorch:部署一下stable diffusion和NeRF

之前都是 *nix 环境使用 pytorch&#xff0c;这次尝试了一下windows。 我们来部署下流行性高的stable diffusion和我觉得实用性比stable diffusion高多了的NeRF Stable Diffusion 其实&#xff0c;我也不知道要写啥&#xff0c;都是按照步骤做就好了&#xff0c;后面等有时间…

如何快速生成项目目录结构树?

经常在网上看到下面这种由一个项目&#xff0c;生成一个结构树&#xff0c;你知道它是怎么生成的吗&#xff1f; 这就是利用本文要介绍的一个工具——Treer&#xff0c;treer就是一款专门用来快速生成目录结构树的命令行工具。 第一步&#xff1a;安装treer 在终端执行全局…

openssl 生成CA及相关证书

生成私钥文件(pem) # 生成私钥 # genrsa&#xff1a;生成RSA秘钥 # 2048&#xff1a;密钥长度为2048比特 # -out&#xff1a;私钥文件路径名 openssl genrsa -out ca_private.pem 2048 # 生成私钥&#xff0c;且加密 # -aes256&#xff1a;使用aes256对私钥进行加密 openssl g…

蓝桥杯第199题 扫地机器人 暴力优化 二分法 简单题 C++

题目 扫地机器人 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/199/learning/?page1&first_category_id1&name%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA 思路和解题方法 首先&#xff0c;通过cin语句输入了终点位置n和障碍物数量k。使用一个数组a来…

微服务学习|初识elasticsearch、操作索引库、文档操作、RestClient操作索引库、RestClient操作文档

初识elasticsearch 什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack (ELK)。被广泛应用在日志数据分析、实…

asn1格式详解

ASN.1&#xff08;Abstract Syntax Notation One&#xff09;是一种用于描述数据结构的标准表示法。它通常用于描述数据交换格式&#xff0c;如证书、密钥和协议消息。ASN.1格式由一系列的类型和值组成&#xff0c;可以使用一些工具和库来解析和处理ASN.1格式的数据。 在C中&a…

python+pytest接口自动化(4)-requests发送get请求

python中用于请求http接口的有自带的urllib和第三方库requests&#xff0c;但 urllib 写法稍微有点繁琐&#xff0c;所以在进行接口自动化测试过程中&#xff0c;一般使用更为简洁且功能强大的 requests 库。下面我们使用 requests 库发送get请求。 requests库 简介 request…

【代码随想录】算法训练计划36

贪心 1、435. 无重叠区间 题目&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 思路&#xff1a; 贪心&#xff0c;重叠个数&#xff0c;和射气球一样,重叠区间…

C# WPF上位机开发(倒计时软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 生活当中&#xff0c;我们经常会遇到倒计时的场景&#xff0c;比如体育运动的时候、考试的时候等等。正好最近我们学习了c# wpf开发&#xff0c;完…

力扣114. 二叉树展开为链表

思路&#xff1a; 根据二叉树前序遍历&#xff1a;根-左子树-右子树&#xff1b;要按照前序遍历将二叉树展开&#xff0c;则遍历节点右子树需要挂载到左子树“最右”节点右子树上&#xff1b;则当前节点 current 左子树 next current->left 的最右节点 rightmost &#xff…

记录一次现网问题排查(分享查域名是否封禁小程序)

背景&#xff1a; 收到工单反馈说现网业务一个功能有异常&#xff0c;具体现象是tc.hb.cn域名无法访问&#xff0c;客户地区是河南省&#xff0c;这里记录下排查过程和思路。 首先梳理链路 客户端域名 tc.hb.cn cname—> domainparking-dnspod.cn(新加坡clb)—> snat—&…

基于ssm的汽车论坛管理系统设计与实现

基于ssm的汽车论坛管理系统设计与实现 摘要&#xff1a;信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题…