当前位置: 首页 > news >正文

【C++】单一职责模式

目录

  • 一、简介
    • 1. 含义
    • 2. 特点
  • 二、实现
    • 1. 将类拆分成多个类
    • 2. 使用命名空间(Namespace)
    • 3. 使用组合而不是继承
  • 三、总结
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

一、简介

1. 含义

在面向对象设计中,单一职责原则(Single Responsibility Principle,简称 SRP)是 SOLID 原则之一,提出了一个类应该只有一个修改的理念。具体来说,一个类应该只有一个引起它变化的原因,即一个类应该只有一个责任。如果一个类承担的责任过多,那么对这个类的修改就会影响到所有依赖它的地方。

2. 特点

在使用单一职责原则时,需要权衡设计的复杂性和可维护性之间的关系。在实践中,通常需要根据具体的项目需求和团队的经验做出相应的决策。

  • 优点:
  1. 可维护性提高: 将一个类的职责限制在一个范围内,使得类的代码更加清晰、简洁。这有助于提高代码的可维护性,降低了修改代码的风险。
  2. 可读性提高: 每个类都有一个明确的职责,这使得代码更容易理解和阅读。当其他开发者阅读代码时,他们能够更容易地理解每个类的目的。
  3. 可测试性提高: 单一职责原则有助于更容易进行单元测试。每个类只负责一个明确定义的职责,因此测试每个职责变得更加简单。
  4. 降低耦合度: 职责划分清晰,类之间的依赖关系更加清晰,从而减少了类之间的耦合度。这样,一个类的变化不太可能影响到其他类。
  • 缺点:
  1. 类的数量增加: 如果划分职责过于细致,可能会导致类的数量急剧增加。这可能会使代码的管理变得复杂,尤其是当某些类只包含很少的代码时。
  2. 系统变得过于分散: 如果过度划分职责,可能会导致系统的职责分散,使得某个功能的实现涉及多个类,需要跨越多个类来理解整个系统的运作。
  3. 设计复杂性增加: 在某些情况下,过于强调单一职责原则可能会导致设计变得过于复杂。有时候适度的耦合可以简化设计,而过度的解耦可能会使设计变得过于抽象和复杂。

二、实现

​ 在C++中,实现单一职责原则的方式包括:

1. 将类拆分成多个类

将一个类中的多个职责拆分成多个独立的类,每个类负责一个职责。这有助于提高代码的可维护性和可扩展性。

// 负责文件操作的类
class FileManager {
public:void readFile(const std::string& filename);void writeFile(const std::string& filename, const std::string& content);
};// 负责数据处理的类
class DataProcessor {
public:void processData(const std::vector<int>& data);
};

2. 使用命名空间(Namespace)

将不同职责的类放置在不同的命名空间中,以隔离它们的功能。

namespace FileManager 
{class Reader { /* ... */ };class Writer { /* ... */ };
}namespace DataProcessor 
{class Processor { /* ... */ };
}

3. 使用组合而不是继承

将不同职责的类通过组合的方式组合到一个类中,而不是通过继承。

class Report 
{
private:FileManager::Reader fileReader;DataProcessor::Processor dataProcessor;public:void generateReport(const std::string& filename) {std::vector<int> data = fileReader.readFile(filename);dataProcessor.processData(data);// 生成报告的逻辑}
};

三、总结

通过遵循单一职责原则,可以使代码更加清晰、可维护、可测试,并且降低了类之间的耦合。这样的设计有助于应对变化,当一个需求发生变化时,只需修改与之相关的类,而不会影响到其他部分的代码。

注意:单一职责原则并不是绝对的,有时候在设计时需要根据具体情况进行权衡,以确保代码的简洁性和可理解性。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

相关文章:

【C++】单一职责模式

目录 一、简介1. 含义2. 特点 二、实现1. 将类拆分成多个类2. 使用命名空间&#xff08;Namespace&#xff09;3. 使用组合而不是继承 三、总结如果这篇文章对你有所帮助&#xff0c;渴望获得你的一个点赞&#xff01; 一、简介 1. 含义 在面向对象设计中&#xff0c;单一职责…...

GPT4-隐者地址

网址 https://evo.ninja/测试是否是GPT4 https://blog.csdn.net/fyfugoyfa/article/details/130254735...

教师考编需要什么条件

教师考编&#xff0c;了解考编需要什么条件是非常重要的。接下来&#xff0c;我来介绍几点教师考编的条件。 需要具备相应的学历背景。一般来说&#xff0c;考编需要具备本科或以上学历&#xff0c;并且所学专业与所报考的岗位相关。在某些特殊情况下&#xff0c;如报考幼儿园教…...

刘家窑中医医院鲁卫星主任:冬季守护心脑血管,为社区居民送去健康关爱

随着冬季的来临&#xff0c;气温逐渐降低&#xff0c;心脑血管疾病的风险也随之增加。为了提高公众对心脑血管疾病的认知和预防意识&#xff0c;北京刘家窑中医医院于近日成功举办了冬季守护心脑血管公益义诊活动。 本次义诊活动主要针对社区居民中的中老年人&#xff0c;特别是…...

专家级定位咨询:打造不可复制的市场地位

在这个快速变化的商业环境中&#xff0c;每个品牌都渴望在市场中占据一个独一无二的位置。但是&#xff0c;真正实现这一点并非易事。这就是为什么专家级定位咨询如此重要&#xff1a;它不仅帮助品牌发现其独特之处&#xff0c;还能指导它们如何有效地利用这一优势来在市场中脱…...

为什么说代码注释是程序员必备的技能?

代码注释是对代码中的特定部分或整体功能的解释和说明。注释添加在代码中&#xff0c;是给程序员看的&#xff0c;当系统运行程序&#xff0c;读取注释时会越过不执行。随着技术的发展&#xff0c;现在具有百万行代码的程序已经很常见了&#xff0c;在这样一个大型的代码中&…...

日期——年月日星期时间封装和年月日时间封装

年月日星期时间 function nowDate(time) {var getTime new Date().getTime(); //获取到当前时间戳var time new Date(getTime); //创建一个日期对象var year time.getFullYear(); // 年let wk new Date().getDay()var month (time.getMonth() 1).toString().padStart(2, …...

RK3568全国产化多网口板卡带poe供电,支持鸿蒙麒麟系统

信迈XM-3568-01主板采用瑞芯微RK3568四核Cortex-A55 处理器&#xff0c;主频最高可达2.0GHz&#xff0c;效能有大幅提升最高可配8GB内存容量&#xff0c;频率高达1600MHz&#xff1b;支持全链路ECC&#xff0c;让数据更安全可靠配置双千兆自适应RJ45以太网口&#xff0c;并扩展…...

UI卡顿问题

1、 监测卡顿的方式 a、Xcode 层级关系是否有异常 b、 instruments 的Animation Hitch工具检测&#xff1a;碰到问题&#xff0c;录制完了无数据&#xff08;用iphone7录制有数据的&#xff0c;iphne14录制无数据&#xff1f;&#xff09; 2、可能导致的卡顿的原因 a、 直播广…...

Linux操作系统的ECS云服务器上搭建WordPress网站教程

WordPress是使用PHP语言开发的博客平台,在支持PHP和MySQL数据库的服务器上,您可以用WordPress架设自己的网站,也可以用作内容管理系统(CMS)。本教程介绍如何在Linux操作系统的ECS实例上搭建WordPress网站。 前提条件 已创建Linux操作系统的ECS实例,并且手动部署LNMP环境…...

【Linux】多线程相关问题

判断题 不论是系统支持线程还是用户级线程&#xff0c;其切换都需要内核的支持&#xff08;F&#xff09; 用户态线程的切换在用户态实现&#xff0c;不需要内核支持。 线程包含CPU现场&#xff0c;可以独立执行程序&#xff08;F&#xff09; 线程包含cpu现场&#xff0c;但是…...

GPS北斗卫星时空信号安全防护装置(授时)介绍

GPS北斗卫星时空信号安全防护装置&#xff08;授时&#xff09;介绍 GPS北斗卫星时空信号安全防护装置&#xff08;授时&#xff09;介绍 当前&#xff0c;我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步&#xff0c;但不加防护的授时装置存在卫星信号被干扰或欺…...

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…...

智慧公交:提高城市出行效率的数字化之路

随着城市化进程的不断加速&#xff0c;公共交通成为人们日常出行的主要方式之一。为了提高公共交通的效率和服务质量&#xff0c;智慧公交应运而生。智慧公交是一种基于物联网、大数据、人工智能等技术&#xff0c;对公共交通进行数字化、智能化改造的新型公共交通系统。 以此为…...

Linux - 内存 - memblock 分配器

说明 memblock是Linux内核启动早期用于管理物理内存的机制&#xff0c;在伙伴系统&#xff08;Buddy System&#xff09;接管内存管理之前为系统提供物理内存分配、释放等功能。相对于伙伴系统&#xff0c;memblock功能和实现较为简单。本文基于&#xff1a;linux_5.10 arm64平…...

SQL、Jdbc、JdbcTemplate、Mybatics

数据库&#xff1a;查询&#xff08;show、select&#xff09;、创建&#xff08;create)、使用(use)、删除(drop)数据库 表&#xff1a;创建&#xff08;【字段】约束、数据类型&#xff09;、查询、修改&#xff08;alter *add&#xff09;、删除 DML&#xff1a;增加(inse…...

四六级高频词组8

目录 词组 其他链接 词组 301. in fashion&#xff08;stylish&#xff0c; most modern&#xff09;时兴&#xff0c;流行 302. after the fashion &#xff08;of&#xff09; 依照… 303. find fault with&#xff08;complain about&#xff1b;criticize&#xff09;找…...

fastapi-amis-admin快速创建一个后台管理系统增加音乐管理功能(3)

感觉为了实现maui的效果。准备了一个后端及restful项目 &#xff0c;如同想吃鱼就健个鲁塘一下&#xff0c;但还是写一下吧。 fastapi_amis_admin 是一个功能强大的框架&#xff0c;旨在帮助开发者在使用 FastAPI 进行 web 开发时&#xff0c;能够快速创建一个高效且易于管理的…...

全球化需要先搬离中国?中国公司出海不应失去“模式自信”

中国企业出海近期热闹非凡&#xff0c;其中以短剧为代表的文化内容产业和跨境电商产业都吸引了大量关注。例如亚马逊在12月12日公布一组最新数据&#xff0c;亚马逊过去一年销售额超过1000万美金的中国卖家数量&#xff0c;同比增长接近30%。中国跨境电商平台在刚刚过去的“黑五…...

三大维度解码剑南春“高质量发展”丨年度盘点

执笔 | 洪大大 编辑 | 扬 灵 2023年即将画上句点&#xff0c;当我们回首这一年为行业带来惊喜的品牌&#xff0c;剑南春是其中之一。 回顾剑南春今年一整年的动作&#xff0c;从新品频发到双节&#xff08;618、双11&#xff09;热销&#xff0c;从全国巡展到荣誉满载&…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.

报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符&#xff0c;最后运行&#xff1a;npm run lint --fix...