单一职责原则(Single Responsibility Principle, SRP)
核心思想:每一个对象应该只有一个单独的职责,每个对象所关注的就是自身职责的完成。
单一职责原则的意思就是“高聚合,低耦合”。每个类只有一个职责,对外只提供一个功能,引起类变化的原因就只有一个。
一个类的职责越多,导致其变化的因素也就越多,其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。
这样做会让程序变的易于修改和维护。但这个过程可能是困难的,因为我们不能轻易的知道哪些职责会发生变化,哪些职责要被提取出来。所以需要一个演化的过程,让我们知道哪些职责需要被提取出来。
里氏替换原则(Liskov Substitution Princiole,LSP)
核心思想:在任何父类出现的地方都可以用它的子类替代。
里氏替换原则的意思就是同一个继承体系中的对象都应该有共同的行为特征。LSP所关注的是怎样良好的使用继承。在LSP里,所有引用基类的地方必须能透明的使用其子类对象。这个原则为良好的继承定义了一个规范,共有四层含义:
1. 子类必须完全实现父类的方法
2. 子类可以有自己的特性
3. 覆盖或实现父类的方法输入的参数可以被放大
4. 覆盖或实现父类的方法输出的参数可以被放大
依赖注入原则(Dependency Inversion Principle,DIP)
核心思想:要依赖于抽象,不要依赖于具体的实现。
依赖注入原则的意思就是在应用程序中,所有的类如果要使用其他的类或者依赖其他是类,都应该依赖他们的抽象类,而不是实现类,这样才能保证系统的可复用性和可维护性。所以我们在日常开发中要针对接口编程,而不是针对实现编程。
依赖注入原则有三点说明:
- 高层模块不应该依赖低层模块,两者都应该依赖于抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
依赖注入原则可以用以下三种方式来实现:
- 通过构造方法传递依赖对象
- 通过set方法传递依赖对象
- 接口声明实现依赖对象
接口隔离原则(Interface Segregation Principle,ISP)
核心思想:不应该强迫客户程序依赖他们不需要的使用的方法。
接口隔离原则的意思就是一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作封装在一个接口中。这里的接口不仅仅是指类接口(class interface),还指对象接口(Object interface)通过new关键字产生的一个实例,它是对一个类型的事务的描述。
接口隔离原则和单一职责原则有一些相似,不过单一职责原则注重的是职责,是业务逻辑的划分。而接口隔离原则要求的是接口的方法尽量少。
在使用接口分离原则的时候也有一些规范:
- 接口尽量小
- 接口高内聚接口内部声明的方法相互之间都要与某个子模块相关,而且这个子模块是必须的
- 接口设计是有限度的,要靠开发者的经验去判断了
最小知识原则(Principle of Least Knowledge,PLK,迪米特法则)
核心思想:一个对象应当对其他对象尽可能少了解。
迪米特原则的意思就是降低各个对象之间的耦合,提高系统的可维护性。在模块之间,应该只通过接口来通信,这可使各个模块耦合程度降到最低,促进软件的复用。
开闭原则(Open Closed Principle,OCP)
核心思想:一个对象对扩展开放,对修改关闭。
开闭原则的意思就是对类的改动是通过增加代码实现的,而不是改动原先的代码。