开闭原则
定义:对扩展开放,对修改关闭
在平时我们程序迭代更新的过程当中,往往会对现有的功能进行修改,但是这样又往往会对我们的程序造成破坏甚至带来致命的错误,所以在对程序进行修改时,尽量不要修改原有的功能,而是通过扩展的方式增加新功能。开闭原则算是六大原则中的一个总原则,之后的五大原则都遵循这个总的开闭原则
。
单一职责原则
定义:一个类只负责一项职责(同样适用于方法和接口)
当在设计一个类时,我们应该注意一个类应该只能具有某一种功能,而不能有多个。同样在重构时,如果发现某一个同时负责着多个功能,应该将它的功能进行拆分。此原则是为了防止我们一个类有多个职责时,我们在修改它的其中一个职责时,可能会对另外的职责功能造成影响。
里氏替换原则
定义:在程序中,子类可以完整的替换父类完成父类的功能
通俗的说,当使用继承时,子类可以可以扩展父类的功能,但不能改变父类的功能。主要有四层含义:
1)子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2)子类中可以增加自己特有的方法
3)当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
4)当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
从定义看,有两层意思,分别解释,首先,高层模块不应该依赖底层模块:类A与类B存在依赖关系(何为依赖),当我们需要将类A修改为依赖于类C,这个时候,我们就需要修改类A。这种情况中,类B类C属于底层模块,类A属于高层模块,我们要做到不修改类A,那么我们的类A就不能依赖类B和类C(底层模块),所以,我们需要将类A依赖改为类B类C的抽象,也就是类B类C实现同一接口,无论之后类需要依赖哪个类,我们都不再需要修改类A了。抽象不应该依赖细节,细节应该依赖抽象:在进行抽象时,不关注具体的细节,也就是具体的实现,而在具体实现时,要依赖抽象,有点不好理解。通俗的说,我们在设计一个框架时,首先要通过抽象的方式搭建,在Java中就是通过抽象类和接口的方式,而具体的实现通过抽象类和接口来实现实现类。依赖原则的中心思想就是面向接口编程
。
接口隔离原则
定义:实现类不应该依赖它不需要实现接口具体方法的接口
接口I需要实现方法a、b、c,具体实现类A实现方法a、b,实现类B实现a、c。A,B都需要实现它们不需要的方法,就违背了这个原则,解决方法其实很简单,就是对接口I进行拆分,然后A和B取分别实现它需要的接口。
迪米特法则
定义:一个对象应该对其他对象保持最少的了解
迪米特法则又可以叫最少知道原则,就是一个类依赖另一个类时,应该对它的依赖类知道得越少越好,也就是降低类和类的耦合。违背这个原则带来的问题是显而易见的:类和类的之间的耦合过高,修改一个类时,会影响其他的类,所以我们要做到低耦合,高内聚。如何避免知道过多的对象,在该对象的方法内,我们应该调用属于以下范围的方法:
- 该对象本身
- 被当着方法的参数而传递进来的对象
- 此方法所创建或实例化的任何对象
- 对象的任何组件(组合关系)