单一职责原则

单一职责说起来比较简单:每个类、方法只有一个代码变更的原因。类和方法的单一职责是在不同的抽象层次,比如红包的发放和使用是不同的功能,这两个功能可以分别定义一个类。这样红包发放代码的变更就不会影响到红包使用的代码。
红包发放类中可能会有批量红包、单个红包发放,我们可以在同一个方法中去实现,如下面代码所示。这样话,如果单个红包发放的代码变更,可能会影响到多个红包发放。而且,如果方法入参中包含boolean类型,往往意味着方法内有多个逻辑分支,违反方法的单一职责原则。

  1. public void sendCoupon(boolean isSingleCoupon){
  2. if(isSingleCoupon){
  3. .......
  4. sendSingleCopon()
  5. ......
  6. }else{
  7. ........
  8. sendMultiCoupon()
  9. ......
  10. }
  11. }

这样的话,我们可以将单个红包的发放和多个红包的发放抽成两个方法。

  1. public void sendCoupon(){
  2. ...........
  3. }
  4. public void batchSendCoupon(){
  5. ...........
  6. }

开闭原则

开闭原则的定义:一个软件实体比如类、方法等,对扩展开放,对修改关闭。当有一个新功能出现时,尽量通过新增类,而不是修改原来的类去实现。

迪米特原则

接口隔离原则

依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
问题由来:类A调用具体实现类B,如果哪天类A的调用关系发生变化,从调用类B改为调用类C。因为依赖的具体实现类,这时候类A的代码需要调整,而调整就意味着风险。
类A是高层模块,类B和类C是底层模块,解决的方案是类B和类C实现共同实现一个接口,类A依赖接口,这样如果发生调用关系的变化,对类A没有影响。
相比于具体实现类,抽象类或者接口要稳定的多,所以在调用关系上,要更多的依赖接口而不是抽象类。

传递依赖关系有三种方式,以上的例子中使用的方法是接口传递,另外还有两种传递方式:构造方法传递setter方法传递。
在实际编程中,我们一般需要做到如下3点:

  • 低层模块尽量都要有抽象类或接口,或者两者都有。
  • 变量的声明类型尽量是抽象类或接口。
  • 使用继承时遵循里氏替换原则。

依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。

里氏替换原则