单一职责原则
一个类只读者一个功能领域中的相应职责。核心思想是“高内聚,低耦合”。
开闭原则
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
重点:灵活性、扩展性
在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
里氏代换原则
所有使用基类的地方必须能透明地使用其子类的对象
在运用里氏代换原则时,应该将父类设计为抽象类或接口,让子类继承父类或实现父类接口,并实现父类中声明的方法,运行时,子类实例替换父类实例,可以很方便地扩展系统的功能,无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。
依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
在引入抽象层后,系统将具有很好的灵活性。在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中,这样一来,如果系统行为发生变化,只需要对抽象层进行扩展,并修改配置文件,而无需修改原有系统的源代码,就能扩展系统的功能,满足开闭原则的要求。
在实现依赖倒转原则时,需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有3种:构造注入、设置注入和接口注入。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
根据接口隔离原则,当一个接口太大时,需要将它分割成一些更小的接口,使用该接口的客户端仅需要知道与之相关的方法即可。(尽量根据不同功能划分接口)
合成复用原则
尽量使用对象组合,而不是继承来达到复用的目的。
两个类之间的关系是“Is-a”,应使用组合或聚合,如果是“has-a”可使用继承。多用关联,少用继承。
迪米特法则
一个软件实体应该尽可能少地与其他实体发生相互作用。
使用迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。因此要求在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此通信,那么这两个对象就不应该发生任何直接的相互作用;如果需要调用另一个对象的方法,可以通过引入第三者转发这个调用,从而降低两个类之间的耦合度。