C++设计模式的设计原则(面向对象八大设计原则)

article/2025/11/5 21:03:27

面向对象设计八大设计原则

  • 一、温故面向对象
  • 二、八大设计原则
  • 三、以史为鉴

   先掌握八大设计原则,再详细看23种设计模式(👈点我)

一、温故面向对象

  (1)隔离变化:从宏观层面上来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。
  (2)各司其职:从微观层面来看,面向对象的方式更强调各个类的“责任”,由于需求变化导致的新增类型不应该影响原来类型的实现。
  (3)理解定义:从语言实现层面来看,对象封装了代码和数据;从规格层面讲,对象是一系列可被使用的公共接口;从概念来讲,对象是某种拥有责任的抽象。

二、八大设计原则

  “设计模式都是基于设计原则衍生而来的,不要求完全掌握全部设计模式,但要求精通理解八大设计原则,从而直接掌握全部设计模式或设计出自己的设计模式”,CEO李建忠如是说

(1)依赖倒置原则(DIP):
● 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)
● 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
举例:如下图,左侧的设计会在需新增一个类的时候带来很多麻烦,比如去头文件增加相应的类,在cpp文件中实现对应类的函数,还需要去继承一下父类等操作。而右侧的设计只需新增一个类,其他都是交由Shape抽象类去实现,我们只需要去新增东西。Shape抽象类实现的是接口哦,也就与第八个FIP原则相辅相成。
在这里插入图片描述

(2)开放封闭原则(OCP):
● 对扩展开放,对更改封闭
● 类模块应该是可扩展的,但是不可修改
举例:在厂家需要生成木板的时候,前期已经生产好一批木板,但后面因更改需求需要生产防火的木板,那我们不可能把已生产好的木板全部销毁,而可以在木板外涂一层防火涂料,这样就符合OCP原则。

(3)单一职责原则(SRP):
● 一个类应该仅有一个引起它变化的原因
● 变化的方向隐含着类的责任

(4)Liskov替换原则(LSP):
● 子类必须能够替换它们的基类(是is - a的关系)。如果A是B的父类,所有需要父类的地方,那么B都必须要可以传过去使用
● 继承表达类型抽象

(5)接口隔离原则(ISP):
● 不应该强迫客户程序依赖它们不用的方法
● 接口应该小而完备。所谓小,尽量不要把不必要的方法都public出去,如果只是子类使用的话就protected,如果是本类使用的话就private

(6)优先使用对象组合,而不是类继承原则(FOCP):
● 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
● 继承在某种程度上破坏了封装性,子类父类耦合度高。像父继承爷、子继承父,这些是非理想的继承,理想的继承应该是类属关系。比如说,父继承人类、人类继承生物;SUV继承汽车、汽车继承交通工具等
● 而对象组合原则只要求被组合的对象具有良好定义的接口,耦合度低

(7)封装变化点原则(ECP):
● 使用封装来创建对象之间的分界层,让设计者可以在层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合

(8)针对接口编程,而不是针对实现原则(FIP):
● 不将变量类型声明为某个特定的具体类,而是声明为某个接口,这是非绝对化的,主要针对业务
● 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口
● 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案

三、以史为鉴

 (1)秦国为什么能统一六国? —— 接口标准化
因为我们是码农,所以我们从技术流的角度来分析。据史书记载,秦的兵器不论东西南北的出土地点,都有统一的标准,包括剑、戈、弩等,甚至弩机、弩体、箭头都是一样的,而其他六国不是。所以在战场支援上,军备物资调配,型号不匹配、接口不统一、战场人员不熟悉使用不同型号的武器,容易在战场上战败。秦不止在武器方面上做了统一,还在钱币、度量衡等做了统一。

 (2)毕生的活字印刷为什么成为四大发明并推动人类文明? —— 针对接口处理
以前的雕版印刷是固定死了的,比如我要生产一个刻有“设计模式”的木牌,再生产“模式设计”的木牌,需要耗费大量工作且繁琐。而活字印刷,只需要将单独刻有的字,嵌入木牌里面的凹槽,就能组成一个木牌,这就是活字印刷的妙处。


http://chatgpt.dhexx.cn/article/kkOuVKvd.shtml

相关文章

设计原则设计模式

导论 什么是设计原则:判断程序设计质量好坏的准则。什么是设计模式:软件设计过程中重复出现问题的解决方案设计原则的作用:指导抽象、类、类关系设计,相当于指导设计程序基础框架(Rank-分层、Role-角色、Relation-类关…

设计原则详解

1.单一职责 一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线&#…

五大设计原则——SOLID

目录 简介: 1、单一职责原则(SRP) 2、开闭原则(OCP) 3、里式替换原则(LSP) 4、依赖倒置原则 (DIP) 5、接口隔离原则 (ISP) 简介: 无论是软件系统设计,还是代码实现…

1. 设计原则

文章目录 设计原则思维导图核心理论SOLID单一职责开放封闭里式替换接口隔离依赖反转 KISSDRYLOD 设计原则思维导图 核心理论 基于接口编程 “基于接口而非实现编程” - “Program to an interface, not an implementation”。 “接口”就是一组“协议”或者“约定”&#xff…

七大设计原则

一、七大设计原则 (1)单一职责原则 (2)接口隔离原则 (3)依赖倒置原则 (4)里氏替换原则 (5)开闭原则 (6)迪米特法则 &#xff0…

chrome浏览器截长图

使用chrome浏览器 打开开发者模式(更多工具->开发者工具) mac 按commandshiftp windows 按ctrlshiftp 然后输入capture 选择capture full size screenshot就可以了 截了个长图的例子

手把手教你截长图

1.截长图的工具 相信很多小伙伴在平时工作做都会碰见截图的问题,那正常的图,我们有各种方式去截取,例如:QQ的CtrlAltA,微信的AltA等等 但是呢,如果要用到长图的时候,就束手无策了,这…

python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。 WebDriver.PhantomJS自带的方法支持对整个网页截屏。 下面提供几种思路。 方式一 针对WebDriver.Chro…

谷歌浏览器怎么截长图?

我们在使用电脑浏览网页的时候难免会需要进行一些长图的截取,而一般的截图只能实现一部分截取,那么我们要如何去实现这个操作呢?下面小编就给大家介绍一下怎么在谷歌浏览器上截长图的操作。 谷歌浏览器网页截长图怎么截? 1、进入C…

html2canvas截长图

github链接 一、下载运行后选择下图的html2canvas即可直接去到路由界面测试 二、下图是html2canvas路由页面,点击右上角的生成图片即可下载长图 三、源码路径(html2canvas源码github) 四、源码(关键在generateImage 这个方法&…

selenium+phantomjs截长图踩坑

目录 需求背景: 调研 phantomjs selenium 服务器部署 需求背景 BI上的报表需要设置定时任务截图发邮件到订阅人的邮箱中。刚开始以为截图的活是前端的,后来发现使自己的锅。 调研 截图的研究了一下,主流应该是 selenium 和 phantomjs。…

microsoft edge怎么截长图_实用技能 | Fireshot 网页截长图工具

FireShot 网页截长屏插件 网页截图有没有什么好方法? 在我们平常的工作、生活和学习中,截图是我们最常用到的功能之一。小编平常用到的是QQ、微信、电脑自带的快捷截图功能以及红蜻蜓截图软件等。 但是在浏览网页时,这些工具功能出现了一个致命的缺点,看到一个长长的文章,…

snipaste怎么滚动截长图_如何截长图,这3种方法你用过吗?

在工作中,经常需要截长图,那在电脑上你一般是如何操作呢?本期Word妹与大家分享2种快速截图技巧。 1、借用QQ工具 在最新的QQ版本中有一个长截图按钮,点击之后直接拉动需要长截图的内容,最后点击完成即可。 2、借用FastStone Capture工具 FSCapture是绿色版本不需要安装,可…

计算机win7截长屏,电脑截长图【应对法子】

喜欢使用电脑的小伙伴们一般都会遇到win7系统电脑截长图的问题,突然遇到win7系统电脑截长图的问题就不知道该怎么办了,其实win7系统电脑截长图的解决方法非常简单,按照 1:打开要截图的WORD文档,点击左上角的另存为或者…

网页截长图

很多时候我们需要在网页上截长图,下面记录下谷歌浏览器截长图的步骤: 1.在浏览器的右上角处找到三个竖着的小黑点按钮,点击选择该按钮,选择更多工具–>开发者工具 2.点击开发者工具后会显示这样的一个小窗口 3.按下CTRLShif…

分享电脑中截图的五种方法(包括截长图)

💂 个人网站:【 海拥】【弗莱迪的物理实验】【开发文档导航】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼小组】💬 免费且实用的计算机…

截长图方法

有的时候,我们可能需要截一个网站或者一些内容的图片,但屏幕不够大,出现滚动条,这时候我们就可以使用截长图的方法来达到截取整个网页的内容。 截长图方法有很多,以下介绍两种我所知道的截长图方法。 第一种方法&…

html5中框架怎么写,HTML5常用框架

HTML5常用框架 前言 随着HTML5规范的不断完善,围绕着这一生态有很多实用的框架,极大的提高了我们的开发效率,常见的框架代表有:UI层面的有Bootstrap、Yui、JqueryUI、CSS3Lib等,JS层面的有JQuery、Zeptojs、Angularjs、…

HTML框架构建

HTML框架构建 1、划分框架 A、使用标签决定如何划分框架.必须要有标签设定每个小窗口的网页,该标签中有src属性为每个URL值指定一个HTML文件(这个文件必须事先做好) B、标签常用的属性 属性描述cols用“像素数”或“%”分个左右窗口&#xf…

7个HTML5移动开发框架,初学HTML5必看

1、IONIC IONIC是目前最有潜力的一款HTML5手机应用开发框架。通过SASS构建应用程序,它提供了很多UI组件来帮助开发者开发强大的应用。它使用JavaScript MVVM框架和 AngularJS来增强应用。提供数据的双向绑定,使用它成为Web和移动开发者的共同选择。即将…