设计原则
- 依赖倒置
- 开放封闭
- 面向接口
- 封装变化点
- 单一职责
- 里氏替换
- 接口隔离
- 组合优于继承
依赖倒置
- 高层模块不应该依赖底层模块, 两者都应该依赖抽象
可以把高层模块理解成应用层, 底层模块可以想象成固定的框架, 用户去使用某个框架应用, 用户不应该去依赖于框架的业务实现, 而应该依赖于两者之间的抽象
- 抽象不应该依赖具体的实现, 具体实现应该依赖于抽象
比如说一个自动驾驶系统公司就是高层模块, 各个汽车厂商就是底层模块, 如果直接相互依赖的话, 高层模块或者底层模块一方有变动的话另一方也要跟着一起变动
应该抽象一个自动驾驶标准, 高层模块和底层模块都依赖它, 这样解耦了两方的变动, 自动驾驶系统和汽车各个厂商允许有他们自己的具体实现, 他们都依赖于自动驾驶标准
开放封闭
- 一个类应该对扩展(组合和继承)开放, 对修改关闭
c++的组合是组合基类的指针, 继承是通过虚函数override
面向接口
- 不将变量类型声明为某个特定的具体类, 而是声明为某个接口
- 客户程序无需获知对象的具体类型, 只需要知道对象所具有的接口
- 减少系统中各部分的依赖关系, 从而实现"高内聚, 低耦合"的类设计方案
封装变化点
- 将稳定点和变化点分离, 扩展修改变化点, 让稳定点和变化点的实现 层次分离
让变化点稳定的变化不要因为变化点的变化直接影响整个代码
单一职责
这个职责说的是功能
- 一个类应该仅有一个引起它变化的原因
里氏替换
- 子类型必须能替换掉它的父类型; 主要出现在子类覆盖父类实现, 原来使用父类型的程序可能出现错误; 覆盖了父类方法却没有实现父类方法的职责
接口隔离
- 不应该强迫客户依赖于他们不用的方法
- 一般用于处理一个类拥有比较多的接口, 而这些接口涉及到很多职责
组合优于继承
- 继承耦合度高, 组合耦合度低
其实说到底设计原则这些东西还是概念为主, 了解具体的实现和理解还是要放在具体的业务场景和代码来实现