单一原则
类的职责要单一,一个类完成一项功能
类本身就是一组属性和行为的集合。是一组,不是多组
开闭原则(单一原则的扩展)
对外扩展开放,对内修改关闭
即为:
1. 尽量不修改已经实现或者定义好的类,因为这个类既然已经完成实现应用在项目中,证明它会被其他许多地方调用。当修改这个类后,原本的逻辑就可能会出现问题,这个时候维护就很难了
2. 完成一个职责的类外可以定义其他类来实现不同的职责,尽可能做到一个类解决一个问题。术业有专攻
如何实现原本的类来调用其他类来实现不同的功能呢?在设计时要预留足够的接口,方便可以调用其他类来实现不同的功能。
依赖倒转原则
定义:
- 高层模块不应该依赖低层模块,两者都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖抽象
第一点解释,举个例子
高层模块可以理解为应用程序,低层模块可以理解为API。
在实现过程中,我们写的应用程序不要直接调用低层的接口,比如数据库MySQL接口。否则当数据库更换成Oracle时,我们需要对修改掉所有调用MySQL的接口(与Oracle不同的地方)
我们可以在应用程序和低层模块接口的地方设计一个抽象类,这个抽象类负责提供调用数据库接口的方法,而继承这个抽象类的子类则可以重写这些方法,是MySQL就调用MySQL的接口,是Oracle就调用Oracle相关的接口,两者互不干涉,这样修改的地方就少了
里氏替换原则
要解释第二点必须先了解里氏替换原则
只需要了解对应是含义:
子类必须能够替换它的父类类型
这代表着:父类中定义的属性和行为在子类都是完全适用的。父类的设计要设计这个事物的共性,特性放在子类作为延伸。
所以,第二点中,抽象 ->抽象类提供事物的共性(虚函数),具体特性(虚函数重写)由子类完成,而细节 -> 子类既能被父类指针指向,同时也能调用重写好的虚函数
不满足里氏替换原则即不满足依赖倒转原则
依赖倒转原则总结
1. 抽象类提供接口的数量固定不变
2. 低层模块是抽象类的子类,继承了抽象类的接口,重写了抽象类的函数
3. 高层模块想要实现的某些功能通过多态来实现(父类指针指向子类对象)