定义

  1. 客户端不应该依赖它不需要的接口。
  2. 类间的依赖关系应该建立在最小的接口上。

    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.

接口隔离原则和单一职责的区别

接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:

  • 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
  • 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

接口隔离原则的实现方法

在具体应用接口隔离原则时,应该根据以下几个规则来衡量。

  • 根据接口隔离原则拆分接口时,首先必须满足单一职责原则。
  • 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
  • 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
  • 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

案例:咖啡机

咖啡厅里面有咖啡机,操作咖啡机的有两种人,分别是客户和员工。
客户选择咖啡类型和加糖量就可以做咖啡了。员工负责维护咖啡机,负责清洗机器,往咖啡机中加水,加咖啡豆等日常事项。
所以先定义咖啡机的接口有如下功能:

  1. public interface CoffeeMachine {
  2. // 选择咖啡类型
  3. void selectCoffeeType();
  4. // 选择加糖量
  5. void selectSugarAmount();
  6. // 做咖啡
  7. void makeCoffee();
  8. // 清洗机器
  9. void cleanMachine();
  10. // 装咖啡豆
  11. void fillCoffeeBeans();
  12. // 往咖啡机中装水
  13. void fillWater();
  14. // 往咖啡机中装糖
  15. void fillSugar();
  16. }

然后分别是客户和员工来使用咖啡机:

  1. // 客户类
  2. public class Customer {
  3. CoffeeMachine coffeeMachine;
  4. public void setCoffeeMachine(CoffeeMachine coffeeMachine) {
  5. this.coffeeMachine = coffeeMachine;
  6. }
  7. // 客户做咖啡
  8. public void makeCoffee() {
  9. // 选择类型
  10. coffeeMachine.selectCoffeeType();
  11. // 选择加糖量
  12. coffeeMachine.selectSugarAmount();
  13. // 制作咖啡
  14. coffeeMachine.makeCoffee();
  15. }
  16. }
  17. // 员工类
  18. public class Staff {
  19. CoffeeMachine coffeeMachine;
  20. public void setCoffeeMachine(CoffeeMachine coffeeMachine) {
  21. this.coffeeMachine = coffeeMachine;
  22. }
  23. public void work() {
  24. // 清洗机器
  25. coffeeMachine.cleanMachine();
  26. // 加入咖啡豆
  27. coffeeMachine.fillCoffeeBeans();
  28. // 加糖
  29. coffeeMachine.fillSugar();
  30. // 加水
  31. coffeeMachine.fillWater();
  32. }
  33. }

如何优化上述代码?
明显我们的接口定义的方法太大了,客户不需要的方法很多,客户不需要进行清洗机器等操作,因此我们把客户和员工操作咖啡机的方法分别进行定义即可。

  1. public interface ICoffeeMachineCustomer {
  2. // 选择咖啡类型
  3. void selectCoffeeType();
  4. // 选择加糖量
  5. void selectSugarAmount();
  6. // 做咖啡
  7. void makeCoffee();
  8. }
  9. public interface ICoffeeMachineStaff {
  10. // 清洗机器
  11. void cleanMachine();
  12. // 装咖啡豆
  13. void fillCoffeeBeans();
  14. // 往咖啡机中装水
  15. void fillWater();
  16. // 往咖啡机中装糖
  17. void fillSugar();
  18. }