1、单一职责原则 SRP
定义:应该有且仅有一个原因引起类的变更。
其实单一职责原则不仅适用于接口和类,也适用于方法。
2、里式替换原则 LSP
定义:所有引用基类的地方必须能透明地使用其子类对象。
在类中调用其他类时务必要使用父类或接口,否则就是违背了里式替换原则。
反之,有子类出现的地方未必可以替换为父类。
注意:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。
特性:
(1)覆盖或者实现父类的方法时输入参数可以被放大。
比如父类中某个参数的入参为HashMap,子类的入参可以为Map
(2)覆写或实现父类的方法时输出结果可以被缩小
如果父类方法返回值为类型T,子类的相同方法可以是T类型,也可以是T的子类。
3、依赖倒置原则:
定义:
模块间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的;
接口或抽象类不依赖于实现类;
实现类依赖接口或抽象类。
其实更精简的定义就是“面向接口编程”。
依赖的三种写法:
(1)构造函数传递依赖对象
(2)Setter方法传递依赖对象
(3)接口声明依赖对象
4、接口隔离原则:
定义:
接口尽量细化,同时接口中的方法尽量少。即尽量使用多个专门的接口。
提供给每个模块的都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。
注意:
根据接口隔离原则拆分接口时,首先必须满足单一职责原则。
接口要高内聚:在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险也就越少,同时也有利于降低成本。
5、迪米特法则 LoD:
定义:
一个对象应该对其他对象有最少的了解。
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。
迪米特法则的核心观念就是类间解耦,弱耦合。
6、开闭原则:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
可以通过子类覆写的方式来替代直接修改某个类的方法。
一个项目的基本路径应该是这样:项目开发、重构、测试、投产、运维,其中重构可以对原有设计和代码进行修改,运维尽量减少对原有代码的修改,保持历史代码纯洁性。