单一职责原则--SRP(Single Responsibility Principle)
仅有一个引起其变化的原因
- 单一职责原则的定义是就
一个类而言,应该仅有一个引起他变化的原因
。也就是说一个类应该只负责一件事情
。如果一个类负责了方法M1,方法M2两个不同的事情,当M1方法发生变化的时候,我们需要修改这个类的M1方法,但是这个时候就有可能导致M2方法不能工作。这个不是我们期待的,但是由于这种设计却很有可能发生。所以这个时候,我们需要把M1方法,M2方法单独分离成两个类。让每个类只专心处理自己的方法。 - 单一职责原则的好处如下:
- 可以降低类的复杂度,一个类只负责一项职责,这样逻辑也简单很多
- 提高类的可读性,和系统的维护性,因为不会有其他奇怪的方法来干扰我们理解这个类的含义
- 当发生变化的时候,能将变化的影响降到最小,因为只会在这个类中做出修改。
开闭原则--OCP(Open Close Principle)
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
- 开闭原则和单一职责原则一样,是非常基础而且一般是常识的原则。开闭原则的定义是软件中的对象(类,模块,函数等)应该
对于扩展是开放的,但是对于修改是关闭的
。
当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,因为这样可能会引起更多的问题。 - 这个准则和单一职责原则一样,是一个大家都这样去认为但是又没规定具体该如何去做的一种原则。
- 开闭原则我们可以用一种方式来确保他,我们用抽象去构建框架,用实现扩展细节。这样当发生修改的时候,我们就直接用抽象了派生一个具体类去实现修改。
里式替换原则--LSP(Liskov Substitution Principle)
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
-
子类可以去扩展父类的功能,但是不能改变父类原有的功能
- 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
- 子类可以增加自己独有的方法。
- 当子类的方法重载父类的方法时候,方法的形参要比父类的方法的输入参数更加宽松。
- 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。
依赖倒置原则--DIP(Dependence Inversion Principle)
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
- 依赖倒置原则指的是一种特殊的解耦方式,使得高层次的模块不应该依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了。
- 这也是一个让人难懂的定义,他可以简单来说就是
- 高层模块不应该依赖底层模块,两者都应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
接口隔离原则--ISP(Interface Segregation Principle)
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
客户端不应该依赖他不需要的接口
- 换一种说法就是类间的依赖关系应该建立在最小的接口上。
- 让调用者依赖的接口尽可能的小。例如人类分男人和女人,男人和女人都要吃饭,但是只有女人每个月来大姨妈,那么如果你设计一个接口里面除了吃饭还有来大姨妈同时给男人和女人用就不合适了。
迪米特原则--LOD(Law of Demeter 又名Least Knowledge Principle)
一个软件实体应当尽可能少地与其他实体发生相互作用。
- 迪米特原则也被称为最小知识原则,他的定义
一个对象应该对其他对象保持最小的了解。
- 因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以这也是我们提倡的软件编程的总的原则:低耦合,高内聚。
- 一个类应该对自己需要调用的类知道得最少,类的内部如何实现、如何复杂都与调用者或者依赖者没关系,调用者或者依赖者只需要知道他需要的方法即可,其他的我一概不关心。