1.单一原则
单一原则的定义为:一个类中应该是一组相关性很高的函数,数据的封装。
简单的来说,就是一个类只实现一个功能。这样的好处当你需要修改某个功能的时候会变得非常简单,只需要找到对应的类进 行修改就OK了。下面我们来看一段代码:
class Person{
......
public void teach(){}
......
public void doHomeWork(){}
......
}
上面的这个Person类,包含一个老师拥有的教书行为,一个学生拥有的做家庭作业行为,以及其他的各种行为。当需要对老师的教书行为或者学生的做家庭作业做出修改时,需要在复杂的Person中找到这两个方法对其进行修改,这样会非常的麻烦。
我们按照单一原则对Person进行拆分:
class Teacher{
......
public void teach(){}
......
}
class Student{
......
public void doHomeWork(){}
......
}
这样,上面的Teacher类和Student类分别实现了教师和学生两个功能,这样当你需要对学生或者教师进行修改的时候,只需要找到这两个功能对应的类进行修改就行了。
遵循单一职责原的优点有:
1).可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2).提高类的可读性,提高系统的可维护性;
3).变更引起的风险降低,变更是必然的,如果遵循单一职责原则,当修改一个功能时,可以显著降低对其他功能的影响。
2.开闭原则
开闭原则的定义为:对于扩展是开发的,对于修改是封闭的
在开闭原则里,一个类的实现仅应因其错误而修改,当要对这个类增加新的元素时,不应对原有代码进行修改,而应对原代码进行拓展,以避免新引入的代码对原有系统产生影响,从而产生新的bug。
遵循开闭原则可以提高系统的稳定性,提高系统的可维护性。
3.里氏替换原则
里氏替换原则的定义为:所有引用基类的地方必须能透明地使用其子类的对象
简单来说就是基类可以出现的地方,把基类替换成子类不会产生错误和异常,但是反过来就不行了,子类出现的地方把子类替换成父类就不一定不会出现问题了。
比如,你定义一个交通工具的基类,有一个移动的方法,在一个类中你要使用基类的子类小轿车的移动方法,可以使用基类进行调用,也可以使用子类进行调用;但是,可能小轿车有它自己的一个独特的方法——在公路上行驶,这时候使用子类小轿车没有问题,但换成基类就会出问题了。
使用里氏替换原则的优点有:
1)代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
2)提高代码的重用性;
3)提高代码的可扩展性,实现父类的方法就可以“为所欲为”了,很多开源框架的扩展接口都是通过继承父类来完成的;
4)提高产品或项目的开放性。
4.依赖倒置原则
依赖倒置原则的定义为:程序要依赖于抽象接口,不要依赖于具体实现。 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
比如你要编写一个教师类,目前你只是要写一个教英语的老师对象,你可能会在类里面写老师如何如何教英语的方法,但是这样是不行的,这样以后加入了语文老师、数学老师就会变得非常麻烦。所以你只需要对教师的一些方法进行抽象,然后写成一个教师的抽象类,后面的语文老师英语老师数学老师什么的具体类就依赖于抽象教师类实现。
遵循依赖倒置的原则的优点有:
1)可扩展性好
2)耦合度低
5.接口隔离原则
接口隔离原则的定义为:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。依据接口隔离原则,当一个接口太大时,我们应该将其分解为更加细小的接口使用。
简单来说,一个接口应该只实现一个功能,不应实现多个功能,比如一个学生类,可能有学习语文,学习数学等多个方法,这时在对外提供接口时不能只提供一个学习接口,接口里面包含学习各种东西。而应该根据学习内容提供多个接口,这样别人在调用你这个接口的时候会更加方便,想使用什么功能就调用什么接口,增强代码的可读性,而且还可以隐藏类中的其他功能。
遵循接口隔离原则的优点有:
1)降低耦合性
2)提升代码的可读性
3)隐藏实现细节
6.迪比特原则
迪比特原则的定义为:一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,这有点类似接口隔离原则中的最小接口的概念。
当一个类对另外一个类进行调用时,只需要知道另外一个类的方法就行了,对类的结构、实现等其他都不需要了解,这样可以降低调用类与被调用类的耦合度,当被调用类的结构什么的发生改变时,只要方法接口不发生改变,对调用类就几乎没有任何影响。
遵循迪比特原则的优点有:
1)降低复杂度
2)降低耦合度
3)增加稳定性