- 单一职责
- 接口隔离
- 依赖倒置
- 里氏替换
- 开闭原则
- 迪米特法则
- (补充)合成复用
开闭原则
开闭原则是面向对象设计的基石,其他的原则都可以看作是实现开闭原则的手段
开闭:开放封闭,程序对扩展开放,对修改封闭,程序增加功能时,通过增加新模块来满足, 不要去改动原有模块,避免对之前功能造成影响
单一职责
一个类应该只具有一种职责,用户类中只针对用户写函数,避免将其他函数,例如订单功能写入,应该新建订单类以完成职责。
单一职责可以降低类的复杂度,提高类的可读性
里氏替换
任何基类出现的地方,子类都可以出现
个人理解:子类继承父类,可以实现方法的扩展,但是不建议重写方法
凡是父类中实现好的方法,实际上都是在制定规约,虽然不强制要求所有子类执行,但是子类任意修改会对整个继承体系造成破坏
依赖倒置
- 高层模块不应该依赖底层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒置的中心思想是面向接口编程
个人理解:
假设类A依赖类B,此时要将依赖改为类C,此时只能改动高层模块A,破坏了开闭 原则。
如果,类B,C全都是接口L的实现类,此时A只需要依赖L。根据接收到的不同类型,调用 不同代码。
接口隔离
- 类间的依赖关系应建立在最小的接口上
实现方式:接口尽量细化,同时保证接口中方法尽量少。
接口隔离原则中,要求使用多个专门接口,提供给多个专门模块,而不是多模块依赖于一个臃肿庞大的接口。接口设计粒度越小越灵活,但是过多接口会使结构复杂,维护困难。
迪米特法则
最少知道原则,一个类应该对其他类的内部信息知道的最少
A类调用B类,B内部方法再复杂,与A无关,A只需调用B提供的API接口。
迪米特法则的另一个解释是只和直接朋友通信
直接朋友:
成员变量,方法参数,方法返回值中出现的类
所以说陌生类最好不要以局部变量的形式出现在类内部
合成复用
尽量使用聚合,不使用继承