C++设计模式:设计原则0

# 本人学习时的笔记,有错必改,不喜勿喷 #

1. 依赖倒置原则(Dependency Inversion PrincipleDIP)

  • 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
  • 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。

上例中,高层模块Manager不直接依赖于具体实现类Worker1和Worker2,而是通过抽象接口IWorker来与它们进行交互。这样,当需要新增或替换具体实现类时,不需要修改Manager类,只需要修改Worker1和Worker2类或者增加新的实现类即可

总结一切都应优先“面向抽象”编程也就是我们设计之前就应该考虑哪些变化哪些又是不会的。

2. 开放封闭原则Open/Closed Principle,OCP

  • 扩展开放更改封闭
    • 系统设计应该允许新功能的添加或现有功能的修改而不需要修改现有的源代码。这通常通过利用抽象和多态来实现。新的功能应该通过添加新的代码来扩展现有的代码,而不是直接修改已有的代码。
  • 模块应该可扩展但是不可修改
    • 一旦设计完成并且实现了,就不应该对其进行修改。这意味着系统的设计应该稳定,并且不需要经常性的修改来适应变化的需求。系统应该通过接口或抽象来隔离变化,使得变化只影响到系统的扩展部分,而不是影响到系统的核心部分。

举例比如图形绘制程序我们可以定义抽象基类Shape其中定义了虚函数virtual void draw()=0,然后派生具体绘制Circle, Rectangle这样如果我们添加新的子类triangle直接继承shape然后实现具体的draw函数即可这样实现了扩展开放修改封闭设计原则

总结OCP涉及比较封装以及多态也就是通过基类定义抽象方法子类具体实现保证方法通用性

3. 单一职责原则Single Responsibility Principle,SRP

  • 一个应该仅有一个引起变化原因
    • 即一个类应该有且仅有一个职责,不应该包含多个不相关的职责。如果一个类承担了多个职责,那么当其中一个职责发生变化时,可能会影响到其他职责,导致类的设计变得复杂和脆弱。
  • 变化方向隐含着责任
    • 类的设计应该根据它可能发生的变化来划分职责。如果一个类可能有多个变化的方向,那么就意味着它可能包含多个职责,应该考虑将其拆分为多个单一职责的类。

举例假设有一个名为FileManager的类,它负责管理文件的读取、写入和删除操作。按照SRP原则,这个类实际上包含了多个职责:文件管理和文件IO操作。如果将来需要改变文件管理的方式,可能会影响到文件IO操作,反之亦然。

根据SRP原则,可以将FileManager类拆分为两个单一职责的类:一个负责文件管理(如FileManager),另一个负责文件IO操作(如FileIOManager)。这样,当需要改变文件管理方式时,只需修改FileManager类而不影响FileIOManager类,反之亦然。

总结定义一个之前就应该考虑这个主要什么并且注意不要让其肩负太多责任

4. Liskov替换 原则(Liskov Substitution Principle,  LSP)
  • 子类必须能够替换它们基类is-a):即在程序中,任何使用基类的地方都应该能够替换为子类,而不会导致程序出现错误或异常行为。这意味着子类应该继承基类的所有行为和属性,并且不能修改基类的行为。
  • 继承表达类型抽象:继承关系应该表达出类型之间的抽象关系,而不是具体的实现细节。子类应该符合基类所定义的类型,而且应该尽量减少对基类的修改。

举例假设有一个图形绘制程序,它有一个Shape基类和派生类Circle和Rectangle。按照LSP原则,任何可以接收Shape对象的地方都应该能够接收Circle或Rectangle对象,而且不应该导致绘制结果错误。

总结里氏替换原则强调is-a继承关系组合模式区别

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值