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


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

  • 1
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

Ac君

在你们的鼓励下我会多多分享代码

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值