C++通透讲解设计模式:单一职责原则

C++通透讲解设计模式:单一职责原则

理解单一职责原则

这里我总结了一个规律,可以用一句话来表示:

永远只做自己分内的事情

注意,这个“分内的事情”是逻辑上的,什么意思呢?举几个例子。

例子

例子1

我是一个学生,我每天做的事情就是:起床、吃饭、上学、放学、写作业、睡觉(假设要做的事情有这些)

那么这些事情就是我“分内”的事情,什么是“分外”的事情呢?

例如,是谁叫我起床的,谁给我做饭的,谁送我上学的,谁接我放学的,作业是谁布置的等等,这些都不是我分内的事情。

例子2

我是一个公司的员工,我负责人事部的面试管理,那么我“分内”的事情就是:

  • 查看简历
  • 问面试问题
  • 得出面试结果

三件事情,至于我该面试谁,这不重要,面试结果该如何反馈给面试者,这不重要,我要做的事情核心就是考察一个人的水平,然后得出结论。

例子3

一直钢笔,想要让它写字的话需要下面的步骤:

  • 拧开笔管
  • 吸墨水
  • 合上笔管
  • 等待墨水出来
  • 等待别人使用

至于是谁拧开笔管,吸什么样的墨水,被谁使用,这些不重要。

总之,只需要做好自己分内的事情,这样就是单一职责原则。

代码讲解与示范

其实有了上面的例子,就能很简单的理解了,我们首先需要一个需求:

实现一个日志记录,可以设置标题、内容,可以向其中添加日志(为了举例子,删除就先不写了),并且可以将其保存到文件系统中。

思路

为了记录日志,我们可以设计一个日志类,存储日志标题和内容,并且支持相应的操作。

首先来设计日志类的成员和存储:

class Journal {
public:string title;vector<string> entries;explicit Journal(const string &title) : title{title} {}void add(const string &entry) {static int count = 0;entries.push_back(to_string(++count) + ": " + entry);}
};

然后我们需要设计将日志存储到文件系统中的功能,这个功能如何实现呢?
有些人会这样设计:

class Journal {
public:string title;vector<string> entries;explicit Journal(const string &title) : title{title} {}void add(const string &entry) {static int count = 0;entries.push_back(to_string(++count) + ": " + entry);}void save(const string &filename) {ofstream ofs(filename);for (const auto &entry : entries) {ofs << entry << endl;}}
};

上面这个方式可以正常运行,但是违背了单一职责原则。

还记得一开始说的单一职责原则的规律吗——“只做分内的事”

那么对于一个日志类来说,保存日志信息到文件系统中是否是一个日志类分内的事情呢?

很显然不是,作为一个日志,你的工作应当是存放日志信息(甚至连管理日志信息的工作都没有)

那么很自然的我们就需要设计另一个类去做存储,这里叫他“存储器”吧!

struct PersistenceManager {static void save(const Journal &j, const string &filename) {ofstream ofs(filename);for (const auto &entry : j.entries)ofs << entry << endl;}
};

整个代码如下:

/********************************************************************* > File Name: 单一职责原则.cpp* > Author: royi* > Mail: royi990001@gmail.com* > Created Time: 2024-12-02 19:25:45*******************************************************************/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <cmath>
#include <ctime>using namespace std;#define __NAMESPACE_SRP_BEGIN__ namespace SRP {
#define __NAMESPACE_SRP_END__ }__NAMESPACE_SRP_BEGIN__struct Journal {string title;vector<string> entries;explicit Journal(const string &title) : title{title} {}void add(const string &entry) {static int count = 0;entries.push_back(to_string(++count) + ": " + entry);}};struct PersistenceManager {static void save(const Journal &j, const string &filename) {ofstream ofs(filename);for (const auto &entry : j.entries)ofs << entry << endl;}
};int main() {Journal journal("Dear Diary");journal.add("I ate a bug");journal.add("I cried today");PersistenceManager::save(journal, "diary.txt");return 0;
}__NAMESPACE_SRP_END__int main() {SRP::main();return 0;
}

:wq 886~~有问题欢迎评论区提问,作者会在一个工作日之内给予回复

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

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

相关文章

Java基础访问修饰符全解析

一、Java 访问修饰符概述 Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限&#xff0c;主要有四种&#xff1a;public、protected、default&#xff08;无修饰符&#xff09;和 private。 Java 的访问修饰符在编程中起着至关重要的作用&#xff0c;它…

llvm源码编译

0x00 获取llvm源码 获取llvm项目源码&#xff1a;git clone https://github.com/llvm/llvm-project.git 但是&#xff0c;该项目较大&#xff0c;且直接从github下载源码可能会超时失败。可利用gitee的镜像项目进行clone&#xff1a;git clone --depth 1 https://gitee.com/m…

SpringBoot源码-Spring Boot启动时控制台为何会打印logo以及自定义banner.txt文件控制台打印

1.当我们启动一个SpringBoot项目的时候&#xff0c;入口程序就是main方法&#xff0c;而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.run(StartApp.class);} }publi…

Uniad复现学习

在优云平台部署训练&#xff0c;加速训练。 关于UCloud(优刻得)旗下的compshare算力共享平台 UCloud(优刻得)是中国知名的中立云计算服务商&#xff0c;科创板上市&#xff0c;中国云计算第一股。 UCloud&#xff08;优刻得&#xff09;旗下的Compshare算力共享平台具有以下优点…

数学建模——Topsis法

数模评价类&#xff08;2&#xff09;——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法&#xff0c;该方法的基本思想是&#xff0c;通过计算每个备选方案与理想解和负理想解之间的距离&#xff0c;从而评估每个…

基于单片机的四位数码管检测有毒气体

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过滑动变阻器连接ADC0832数模转换器模拟有毒气体浓度检测&#xff0c;通过数码管实时显示&#xff0c;如果超过阈值&#xff0c;则蜂鸣器报警&#xff0c;灯光亮起。按…

小程序 - 比较数字大小

小程序交互练习 - 比较数字大小的小程序 目录 比较数字大小 功能描述 准备工作 页面内容 设置页面事件 页面绑定事件 比较大小 按钮绑定事件 比较事件 设置结果显示 页面样式 功能截图 总结 比较数字大小 本案例将实现“比较数字大小”微信小程序&#xff0c;它的…

windows下用mysqld启动免安装mysql

windows系统可以下载免安装版本&#xff0c;就是绿色版&#xff0c;里面包含mysql运行的所有必要条件。 ![[Pasted image 20241128231459.png]] 启动步骤&#xff1a; 解压&#xff0c;然后在解压目录创建my.ini。 [mysqld] # 设置13306端口 port13306# 设置mysql的安装目录…

windows安装itop

本文介绍 win10 安装 itop 安装WAMP集成环境前 先安装visual c 安装itop前需要安装WAMP集成环境(windowsApacheMysqlPHP) 所需文件百度云盘 通过网盘分享的文件&#xff1a;itop.zip 链接: https://pan.baidu.com/s/1D5HrKdbyEaYBZ8_IebDQxQ 提取码: m9fh 步骤一&#xff1…

Leetcode - 周赛425

目录 一&#xff0c;3364. 最小正和子数组 二&#xff0c; 3365. 重排子字符串以形成目标字符串 三&#xff0c;3366. 最小数组和 四&#xff0c;3367. 移除边之后的权重最大和 一&#xff0c;3364. 最小正和子数组 本题可以直接暴力枚举&#xff0c;代码如下&#xff1a; …

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

mfc110u.dll是什么意思,mfc110u.dll丢失解决方法大全详解

mfc110u.dll是Microsoft Foundation Classes (MFC)库的一个特定版本&#xff08;版本11.0&#xff09;的Unicode动态链接库文件。MFC是Microsoft为C开发者设计的一个应用程序框架&#xff0c;主要用于简化Windows应用程序的开发工作。这个框架封装了很多Windows API函数&#x…

debian 11 虚拟机环境搭建过坑记录

目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12&#xff0c;安装后出现包依赖问题&#xff0c;搞了半天&…

JAVAWeb之CSS学习

前引 CSS&#xff0c;层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有网页对象和模型样式编辑的能力&#xff0c;简单来说&#xff0c;美化页面。…

macos下brew安装redis

首先确保已安装brew&#xff0c;接下来搜索资源&#xff0c;在终端输入如下命令&#xff1a; brew search redis 演示如下&#xff1a; 如上看到有redis资源&#xff0c;下面进行安装&#xff0c;执行下面的命令&#xff1a; brew install redis 演示效果如下&#xff1a; …

element ui select绑定的值是对象的属性时,显示异常.

需要声明 value-key"value",如果还不行可能是数据类型不一致数字0和字符串0是不一致的. el-select v-model"value" clearable placeholder"Select" value-key"value" style"width: 240px"><!-- <el-option v-for&…

黑马程序员Java笔记整理(day06)

1.继承的特点 2.继承的权限 3. 4.小结 5.方法重写 6.子类构造器 7.兄弟构造器 8.多态 9.小结

VPC9527同步整流控制器,相对最大电压检测与强力自供电,与MP6908完全PIN TO PIN

VPC9527 是一款高性能的同步整流控制器,它兼容 CCM 和 DCM 两种模式,最大工作频率高达 700kHz;可 通过 SEL 引脚的逻辑电压来选择 400nS 或 800nS 两个关断检测的屏蔽时间;可通过 VLC 引脚来调整限压导通的 参数,以便与所选同步整流管的参数相匹配,获得适应的最优性能;它…

万字长文解读深度学习——多模态模型BLIP2

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总 万字长…