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

[设计模式] 浅谈SOLID设计原则

目录

  • 单一职责原则
  • 开闭原则
  • 里氏替换原则
  • 接口隔离原则
  • 依赖倒转原则

SOLID是一个缩写词,代表以下五种设计原则

  1. 单一职责原则 Single Responsibility Principle, SRP
  2. 开闭原则 Open-Closed Principle, OCP
  3. 里氏替换原则 Liskov Substitution Principle, LSP
  4. 接口隔离原则 Interface Segregation Principle, ISP
  5. 依赖倒转原则 Dependency Inversion Principle, DIP

注:
这些原则是Robert C. Martin 于21世纪初提出的,实际上这只是从其著作&博客中几十条中选择出来的5条。Robert C. Martin,世界级编程大师,设计模式和敏捷开发先驱,敏捷联盟首任主席,C++ Report前主编。20世纪70年代初成为职业程序员,后创办Object Mentor公司并任总裁。后辈程序员亲切地称之为“Bob大叔”。

单一职责原则

现在有一个日记类Journal,包含标题和若干条记录,通过代码可以描述为:

class Journal
{std::string title;std::vector<std::string> entries;explicit Journal(const std::string& _title) : title{_title}{}
};

现在,添加一个 增加记录 的功能,每条记录以一个按序号增加的数字为前缀:

void Journal::add(const std::string& entry)
{static uint32_t count = 1;entries.push_back(to_string(count) + ": " + entry);
}

现在对于这个类的使用,我们可以直接:

Journal j{ "Happy Day" };j.add("This is first log");
j.add("This is second log");

在这里插入图片描述
将 “添加记录”功能作为Journal类的一部分从业务角度来说,是有意义的,因为日记类本身就需要这个功能,维护日记中的记录是Journal类的职责,所以说Journal类中任何与记录有关的功能都是合理的。

现在有了一个新的需求:将日记信息持久化(简单来说保存到文件吧),那么也可以在Journal中添加一块代码:
void Journal::save(const std::string& filePath)
{std::ofstream ofs(filePath);for (const auto& s : entries){ofs << s << endl;}
}

代码好写,但是,这么做是正确的吗?(不能够说这种方式是错的,但至少是不正确的),因为: Journal类的职责是维护日志记录,而不是将他们写到磁盘持久化!
如果将这个功能添加到有持久化需求的类中,有关持久化方法的改动都需要在每个类中修改,这显然不是我们想要的!
比较好的方法是:单独考虑这个功能,将这个feature添加到独立的类中,比如可以:

class PersistenctManager
{static void save(const Journal& j, const std::string& filePath){std::ofstream ofs(filePath);for (const auto& s : j.entries){ofs << s << endl;}}
};

这样就比前面的方式好了很多,涉及到持久化的地方只需要改动一处,而不需要往每个涉及到的类中去修改
这正是所说的单一职责原则:每个类只有一个职责,因此也只有一个修改该类的原因(当然是只有该职责发生变化时)

开闭原则

里氏替换原则

接口隔离原则

依赖倒转原则

相关文章:

[设计模式] 浅谈SOLID设计原则

目录 单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒转原则 SOLID是一个缩写词&#xff0c;代表以下五种设计原则 单一职责原则 Single Responsibility Principle, SRP开闭原则 Open-Closed Principle, OCP里氏替换原则 Liskov Substitution Principle, LSP接口隔离原则 …...

基于Java+SpringBoot+Vue的旧物置换网站设计和实现

基于JavaSpringBootVue的旧物置换网站设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 摘 要 随着时代在一步一步在进步&#xff0c;旧物也成人们的烦恼&#xff0c;…...

Java基本语法2

目录 Java基本语法 第一个Java程序 基本语法 Java标识符 Java修饰符 Java变量 Java数组 Java枚举 Java关键字 Java注释 Java 空行 继承 接口 Java基本语法 一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介…...

【数据结构】树的存储结构;树的遍历;哈夫曼树;并查集

欢~迎~光~临~^_^ 目录 1、树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2、树与二叉树的转换 3、树和森林的遍历 3.1树的遍历 3.1.1先根遍历 3.1.2后根遍历 3.2森林的遍历 3.2.1先序遍历森林 3.2.2中序遍历森林 4、树与二叉树的应用 4.1哈夫曼树…...

CSS选择器练习小游戏

请结合CSS选择器练习小游戏进行阅读&#xff08;网页的动态效果是没有办法通过静态图片展示的&#xff09; 网址&#xff1a;请点击 有些题有多种答案&#xff0c;本文就不一一列出了 第一题 答案&#xff1a;plate第二题 答案&#xff1a;bento第三题 答案&#xff1a;#fa…...

Python运算符、函数与模块和程序控制结构

给我家憨憨写的python教程 ——雁丘 Python运算符、函数与模块和程序控制结构 关于本专栏一 运算符1.1 位运算符1.1.1 按位取反1.1.2 按位与1.1.3 按位或1.1.4 按位异或1.1.5 左移位 1.2 关系运算符1.3 运算顺序1.4 运算方向 二 函数与模块2.1 内建函数2.2 库函数2.2.1 标准库…...

微服务保护-Sentinel

初识Sentinel 雪崩问题及解决方案 雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&a…...

Doris 导出表结构或数据

MYSQLDUMP 导出表结构或数据 Doris 在0.15 之后的版本已经支持通过mysqldump 工具导出数据或者表结构 使用示例​ 导出​ 导出 test 数据库中的 table1 表&#xff1a;mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1导出 test 数…...

SELECT * from t_user where user_id = xxx,可以从那几个点去优化这句sql

优化SQL查询可以从以下几个方面入手&#xff1a; 1. 索引优化&#xff1a;通过为查询涉及的列添加合适的索引&#xff0c;可以提高查询的效率。在该SQL语句中&#xff0c; user_id 列被用作查询条件&#xff0c;可以为 user_id 列创建一个索引。 2. 避免使用 SELECT *&#xf…...

解决报错 java.lang.IllegalArgumentException: Cannot format given Object as a Date

报错原因&#xff1a;我们在SimpleDateFormat.format转化时间格式的时候&#xff0c;传入的值无法转换成date而报的错 我的代码大概就是下面这种 LocalDate now LocalDate.now();String format1 new SimpleDateFormat("yyyy-MM-dd").format(now); 发现SimpleDateF…...

【Git】03-GitHub

文章目录 1. GitHub核心功能2. GitHub搜索项目3. GitHub搭建个人博客4. 团队项目创建5. git工作流选择5.1 需要考虑的因素5.2 主干开发5.2 Git Flow5.3 GitHub Flow5.4 GitLab Flow(带生产分支)5.4 GitLab Flow(带环境分支)5.4 GitLab Flow(带发布分支) 6. 分支集成策略7. 启用…...

Java手写最短路径算法和案例拓展

Java手写最短路径算法和案例拓展 1. 算法手写的必要性 在实际开发中&#xff0c;经常需要处理图的最短路径问题。虽然Java提供了一些图算法库&#xff0c;但手写最短路径算法的必要性体现在以下几个方面&#xff1a; 理解算法原理&#xff1a;手写算法可以帮助我们深入理解最…...

深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战。大家知道现在各个平台发的漂亮小姐姐,漂亮的图片是怎么生成的吗?这些生成的底层原理就是用到了Stable Diffusion模型。Stable Diffusion是一种基于深度学习的图…...

基于matlab实现的多普勒脉冲雷达回波仿真

完整程序&#xff1a; clear all;clc;close all; fc3e9; %载波频率 PRF2000; Br5e6; %带宽 fs10*Br; %采样频率 Tp5e-6; %脉宽 KrBr/Tp; %频率变化率 c3e8; %光速 lamda…...

Linux服务器中安装Anaconda+Tensorflow+Keras

Anaconda安装 从https://repo.anaconda.com/archive/查看你需要下载的Anaconda版本&#xff0c;例如2020.11的x86_64&#xff08;uname -a 查看linux框架&#xff09;版下载Anaconda到linux服务器&#xff0c; wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Li…...

ubuntu+.net6+docker 应用部署教程

先期工作 1、本地首先安装 Docker Desktop 2、本地装linux in windows 3、生成镜像 后期工作 1、云服务器部署 生成镜像方法 1、生成Dockerfile配置文件 开发工具visual studio 2022 如果项目已经存在&#xff0c;可以选中项目&#xff0c;右键点击->选择添加Docker…...

Spring常见面试题总结

什么是Spring Spring是一个轻量级Java开发框架&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题&#xff0c;以提高开发效率。它是一个分层的JavaSE/JavaEE full-stack&#xff08;一站式&#xff09;轻量级开源框架&#xff0c;为开发Java应用程序…...

Git全套命令使用

日升时奋斗&#xff0c;日落时自省 目录 1、Git安装 1.1、创建git本地仓库 1.2、配置Git 1.3、认识Git内部区分 2、Git应用操作 2.1、添加文件 2.2、查看日志 2.3、查看修改信息 2.4、查看添加信息 3、版本回退 4、撤销修改 4.1、工作区撤销 4.2、已经add&#xf…...

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive reactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代option api的data的替代,可以存放任何数据类型,而reactive声明的数据类型只能是对象; 先抛出结论,再详细说原因:非必要不用rea…...

JavaScript函数this指向

一、this的指向规则 1.this到底指向什么呢&#xff1f; 我们先来看一个让人困惑的问题&#xff1a; 定义一个函数&#xff0c;我们采用三种不同的方式对它进行调用&#xff0c;它产生了三种不同的结果 // 定义函数 function foo(name) {console.log("foo函数:", …...

Java的序列化

写在前面 本文看下序列化和反序列化相关的内容。 源码 。 1&#xff1a;为什么&#xff0c;什么是序列化和反序列化 Java对象是在jvm的堆中的&#xff0c;而堆其实就是一块内存&#xff0c;如果jvm重启数据将会丢失&#xff0c;当我们希望jvm重启也不要丢失某些对象&#xff…...

计算机二级python简单应用题刷题笔记(一)

计算机二级python简单应用题刷题笔记&#xff08;一&#xff09; 1、词频统计&#xff1a;键盘输入一组我国高校所对应的学校类型&#xff0c;以空格分隔&#xff0c;共一行。2、找最大值、最小值、平均分&#xff1a;键盘输入小明学习的课程名称及考分等信息&#xff0c;信息间…...

Spring注解家族介绍: @RequestMapping

前言&#xff1a; 今天我们来介绍RequestMapping这个注解&#xff0c;这个注解的内容相对来讲比较少&#xff0c;篇幅会比较短。 目录 前言&#xff1a; RequestMapping 应用场景&#xff1a; 总结&#xff1a; RequestMapping RequestMapping 是一个用于映射 HTTP 请求…...

系统架构设计师(第二版)学习笔记----信息安全系统及信息安全技术

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息加解密技术 文章目录 一、信息安全系统的组成框架1.1 信息安全系统组成框架1.2 信息安全系统技术内容1.3 常用的基础安全设备1.4 网络安全技术内容1.5 操作系统安全内容1.6 操作系统安全机制1.7 数据…...

交换机的工作原理(含实例,华为ensp操作)

目录​​​​​​​ ​​​​​​​1.交换机学习和转发 案例 1.设置静态地址表项 2.配置黑洞mac地址表项 1.交换机学习和转发 交换机工作在数据链路层。当交换机从某个端口收到一个帧时&#xff0c;它并不是向所有的接口转发此帧&#xff0c;而是根据此帧的目的MAC地址&a…...

从字符串中删除指定字符

任务描述 编写一个函数实现功能&#xff1a;从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如&#xff1a;程序执行时输入字符串&#xff1a;turbo c and Borland c&#xff0c;从键盘输入字符n&#xff0c;则输出后变为&#xff1a;turbo c ad Borlad c。如…...

Xcode14.3.1 真机调试iOS17的方法(无iOS17 DeviceSupport)

由于iOS17需要使用Xcode15 才能调试&#xff0c;而当前Xcode15都是beta&#xff0c;正式版还未出&#xff0c;那么要真机调试iOS17的方式一般有两种&#xff1a; 方法一&#xff1a; 一种是下载新的Xcode15 beta版 &#xff08;但Xcode包一般比较大&#xff0c;好几个G&#…...

JWT基础

概念 JSON Web Token本质上就是一串字符串&#xff0c;一串包含了很多信息的字符串令牌拥有三个部分头部-包含加密算法和令牌类型{"alg":"算法名称","type":"JWT"}负载-包含数据和信息-七个官方默认-也可以自己定义内容{iss&#xff…...

关于远程工作的面试可能存在的陷阱

附上看到的完整帖子地址&#xff1a;面试 POPER 的后端开发工程师的离奇经历 分享一下我遇到过的&#xff0c;我至少面试过10个远程工作&#xff0c;其中有3个的面试是直接让我完成一个需求的&#xff0c;前两次都耐心做了&#xff0c;第3次看到相同要求时我都懒得回复了&…...

做网站蓝色和什么颜色搭配好看/如何建站

文章目录前言一、导入相关库二、加载Cora数据集三、定义GraphSAGE网络3.1 定义GraphSAGE层3.1.1 定义权重 W3.1.2 特征映射3.1.3 节点特征更新3.1.4 SAGEConv层3.2 定义GraphSAGE网络四、定义模型五、模型训练六、模型验证七、结果完整代码前言 大家好&#xff0c;我是阿光。 …...

dede网站移动端怎么做/如何做企业产品推广

deque概述 vector是单向开口的连续线性空间&#xff0c;deque是双向开口的连续线性空间。 双向开口&#xff0c;意思是可以在首尾两端分别做元素的插入和删除操作。 deque允许常数时间内对首尾两端进行元素的插入或删除&#xff0c;且deque没有容量capacity的概念&#xff0c;因…...

福州建设注册中心网站/关键词查询网

DateTime.Now;//当前时间 DateTime.AddDays(1)&#xff1b;//明天时间 eg&#xff1a; DateTime str DateTime.Now; DateTime str2 str.AddDays(1);...

wordpress网站正在建设中/微友圈推广平台怎么加入

文章目录 零、写在前面一、题目描述二、解题思路三、代码详解四、推荐专栏五、习题练习零、写在前面 目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券。   今天是学习 「 C语言 」 打卡的第三十一天,学习方式很简单,每天…...

自己怎么做网站啊/无人区在线观看高清1080

Linux系统平台下用Fdisk分区格式化硬盘 格式化与分区 hd--IDE设备 sd--SCSI设备 fdisk -l /dev/sda 查看第一块硬盘分区情况 fdisk /dev/sdb 给第二块硬盘分区 command acton (m for help)&#xff1a;m #显示命令列表 a-设置可引导标志&#xff1b;b-设置卷标&#xff1b; d-删…...

网站怎么做备案变更/手机端网站优化

文章目录七层是什么&#xff1f;七层代码Entity层U层Facade层B层IDAL层Factory层DAL层七层遇到的问题&#xff1a;1.System.NullReferenceException&#xff1a;未将对象引用设置到对象的实例2.抽象工厂反射&#xff08;未能加载文件或程序集 “DAL”或它的某一个依赖项。系统找…...