一、单一职责原则
应该有且仅有一个原因引起类的变更。使用的时候,一个类实现多个接口,把多个类融合在一个数据类中。
单一职责的好处
- 类的复杂度降低,明确职责。
- 可读性提高
- 可维护性提高
- 引起变更的风险降低
对于单一职责的判断要依据环境和项目的不同而不同,不要强行使用单一职责原则而增加项目的复杂度
方法的单一职责
一个方法尽可能完成一件事情,比如修改用户密码的方法不要放在修改用户信息的方法中。
总结
接口一定要做到单一职责,类的设计尽量做到只有一个原因引起比变化。
二、里式替换
只要父类出现的地方子类就可以出现,而且替换为子类也不会出现任何的异常。有子类的地方,父类不一定适应。
四层含义
-
子类必须完全实现父类的方法
-
子类可以有自己的方法和属性
-
覆盖或者实现父类的方法时输入参数可以被放大
里式替换原则需要制定一个契约,也就是父类接口。契约制定了,也就同时制定了前置条件和后置条件,前置条件就是你要让我执行,就必须满足我的条件。后置条件就是我执行完了需要反馈。子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。
-
复写或者实现父类的方法时输出结果可能会缩小
父类的一个方法的返回值是一个类型T,子类的相同方法(重载或覆写)的返回值为S,那么里氏替换原则就要求S必须小于等于T,也就是说,要么S和T是同一个类型,要么S是T的子类。
三、依赖倒置
高层模块不应该依赖低层模块,两者应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
总之,就是面向接口编程
优点
- 降低耦合
- 降低并发开发的风险
- 简化后期的维护和开发
依赖对象的传递
1. 构造函数
在类中通过构造函数声明依赖对象
2. Setter方法注入
在接口中加入set方法实现依赖注入
3. 接口声明依赖对象,和2类似
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合
依赖倒置的方法
- 任何类都不应该从具体类派生
- 尽量不要复写基类的方法
- 结合里式替换的原则
倒置到底是什么意思
所谓倒置并不是字面意义的相反方向,而是需要相对于正置而言,所谓正置,就是面向实现编程,也就是类之间依赖于实现类。和实现相反,倒置就是面向于抽象编程。
不要盲目的使用依赖倒置,需要审时度势,避免投入大于产出,面向接口编程,但是前提是面向人民币编程。
四、接口隔离原则
客户端不应该依赖它不需要的接口,类间的依赖关系应该建立在最小的接口上。
也就是接口细化,接口纯洁,提供给几个模块,就应该有几个接口。
接口
一般分为两种
1. 实例接口
Person xiaoming = new Person()
创建一个Person对象xiaoming,此时产生了一个实例,Person类就是xiaoming 的接口,从这个角度讲,Java中的类也是一种接口。
2. 类接口
Java中使用interface定义的接口。
四层含义
- 接口尽量小,但是在拆分接口的时候,要尽量满足单一职责原则
- 接口要高内聚,提高处理能力,减少对外的交互,减少public方法
- 定制服务,单独为一个个体提供服务
- 接口设计是有限度的,这个嘛,靠自己掌握了。。。
五、迪米特法则,也成最少知识原则
一个对象对其需要耦合或者调用的类知道的越少越好。
四层含义
- 只和朋友交流
出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。类与类之间的关系是建立在类间的,而不是方法间,因此一个方法尽量不引入一个类中不存在的对象 - 朋友间也是有距离的
一个类公开的public属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。 - 自己的就是自己的
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中
六、开闭法则
对扩展开放,对修改关闭,通过扩展来实现变化,而不是通过修改已有的代码。