1、单一职责原则
单一职责原则的核心思想是要求一个类只具有一项职责,并且引起这个类发生变化的原因只有一个。
如果一个类承担的责任过多,这些职责之间难免相互关联,高度耦合,这与面向对象高内聚低耦合的原则是相悖的。当类的职责过多,就应该考虑将类拆分,而拆分的原则就是单一职责原则。
使用单一职责原则可以使类变得简单,复杂度更低,并且短小的代码也更容易维护,可读性更高,此外当程序发生变更时,可以将变更风险降到最低。
2、里氏替换原则
里氏替换原则也叫做利斯科夫替换原则,由图灵奖得主芭芭拉利斯科夫女士提出,其核心思想是父类出现的地方必然能用子类替换,并且替换后程序的行为不会发生变换。
但是要注意的是,里氏替换原则反之是不成立的,也就是说,子类出现的地方不一定能用父类替换,因为子类可以添加新的行为,而这些行为是子类特有的,父类中并不具备。
里氏替换原则实际上对继承的方式提出了约束。在遵循里氏替换原则的前提下,子类应该尽可能不覆盖父类中已经实现的方法,因为这可能会破坏继承体系,使得系统的行为难以控制,但是子类新增的方法不受限制。
3、依赖倒置原则
依赖倒置原则的核心思想是程序应该依赖于抽象的接口,而不应该依赖于具体的类,或者编程时应该面向接口编程。
在上层调用下层的过程中,如果下层是具体的类,那么类一旦发生变化,上层代码很可能也会发生变更。如果下层是抽象的接口,而接口的变化概率很小,即便实现接口的类发生了变化,只要保持接口稳定,上层代码就不需要改变。
由于下层模块的修改而迫使上层模块发生变更的设计是荒谬的,因此在设计时应该使用面向接口的方式:下层模块实现抽象的接口,而上层模块只需依赖于这些抽象的接口,而无需依赖于具体的实现。
4、开放封闭原则
开放封闭原则的核心思想是程序应该是可扩展的,而不是可修改的,或者说程序对扩展开放,对修改关闭。
实现开放闭合原则的关键还是要面向接口编程,让类依赖于抽象的接口。由于接口不会发生改变,因此依赖于接口的类也不会发生改变,从而实现对修改封闭,而通过实现接口可以定义新的类,满足新需求,从而实现对扩展开放。通过开放闭合原则设计出来的系统既能保证程序的灵活性,很方便地扩展新功能,又能保证程序的稳定性,控制需求变更的风险,降低维护成本。
5、接口隔离原则
接口隔离原则的核心思想是尽量使用多个功能单一的小接口,而不要使用一个功能复杂的大接口,对一个庞大接口的依赖很容易造成接口污染。
如果接口中包含很多方法,实现接口的类必须实现接口中的每一个方法,不管这个方法对于类是否有实际意义,这显然不是一个好的设计,因此需要对这个接口进行拆分,将其拆分为若干个小接口。
在运用接口隔离设计原则设计接口时,需要把握好接口的粒度,过大的接口会造成接口臃肿,过小的接口会造成接口泛滥,遵循的原则是接口只暴露调用方所需要的方法即可。
6、最少知道原则
最少知道原则也叫迪米特原则,其核心思想是一个对象对其它对象的了解应该尽可能地少,对象之间通过尽量少的方法联系。
最少知道原则的目的是降低类之间的耦合度。由于每个类都减少了对其他类的不必要的依赖,因此类之间的耦合度降低了。但是为了让非直接类之间进行通信,必须使用中介类,这无疑增加了程序的复杂度。