依赖倒置,接口隔离,傻傻分不清楚~

730 阅读3分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

1. 依赖倒置原则(Dependence Inversion Principle DIP)

还是以上面的 Order 类图为例,我们在定义 SubmitOrderService 的方法的时候依赖了 Order 类,在设计的时候我们使用的是 Order 类,而不是 JDOrder 这个子类,这里的设计就遵守了 依赖倒置原则

依赖倒置原则的定义:

High level modules should not depend upon low level modules,Both should depend 
upon abstractions.
高层模块不应该依赖低层模块,两者都应该依赖抽象

Abstractions should not depend upon details.
抽象不应该依赖细节

Details should depend upon abstracts.
细节应该依赖抽象

高层模块一般是抽象层,低层模块是具体的实现层,在上面的例子中 SubmitOrderService 就是高层模块,JDSubmitOrderServiceImpl、 JDOrder 就是低层模块。

在这个例子中,可以将依赖倒置原则翻译成 SubmitOrderService 不应该依赖 JDOrder, 而应该依赖 JDOrder 的抽象层 Order。 JDSubmitOrderServiceImpl 应该依赖 Order。

这么做是为了方便后期扩展,提高程序的可扩展性,想象一下,我们再增加一个 TMSubmitOrderServiceImpl,如果接口中定义的是 JDOrder,那么我们定义的 TMSubmitOrderServiceImpl 就没办法实现了。 而使用 Order 作为参数,就完全可以正常实现。在调用的时候我们可以传入一个 TMOrder 作为参数。

依赖倒置原则是告诉我们如何设计类的依赖关系,目的是降低类与类之间的耦合,提高系统的稳定性和可扩展性。

2. 接口隔离原则(Interface Segregation Principle ISP)

假如我们需要设计一个订单相关的接口, OrderService 这个服务可能会提供一些增删改查的接口,提供给管理模块使用,还有一些订单相关的接口,比如下单接口,订单撤销接口,这些接口不应该放到 OrderService 中。而是写在另外一个 Service 中,比如我们上文中的 SubmitOrderService 中。这里就遵守了 接口隔离原则

2_4_order类图

OrderManager 不应该依赖下单,相关的接口,所以需要将下单相关的接口"隔离"出来。

接口隔离原则有两种定义:

  • Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依赖它不需要的接口。)

  • The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)

针对我们上面的例子

  • 客户端(OrderManager) 不应该依赖它不需要的接口(下单接口)。
  • OrderManager 与 OrderService 的依赖关系应该建立在最小的接口上。

接口隔离原则是在告诉我们,应该以什么规则将接口组合到一起,应该以什么规则将接口拆分到不同的类中。

PS: 接口隔离原则中的"接口",是指的 Java 中 interface 里某个具体的方法。而不是 Java 中使用 interface 声明的某个 class 文件