设计模式原则 - 接口隔离原则(二)

ゞ 浴缸里的玫瑰 2023-09-23 19:19 286阅读 0赞

接口隔离原则

  • 一 官方定义
  • 二 案例演示
    • 普通方案
      • 案例分析
    • 解决方案
      • 解决方案
    • 案例总结
  • 三 与单一职责原则对比

一 官方定义

接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为:

  1. Clients should not be forced to depend upon interfaces that they don’t use.
    (客户端不应该依赖它不需要的接口)
  2. The dependency of one class to another one should depend on the smallest possible
    interface. (类间的依赖关系应该建立在最小的接口上)

基本介绍
通俗的来讲,不要在一个接口里面定义过多的方法,接口应该尽量细化

二 案例演示

假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆, 两个类张厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要李师傅来切番茄和切土豆

普通方案

  1. public class SegregationDemo {
  2. public static void main(String[] args) {
  3. //水果店类
  4. new FruitShop().cutApple(new CookZhang());
  5. new FruitShop().cutTomato(new CookZhang());
  6. //蔬菜店类
  7. new VegetableShop().cutTomato(new CookLi());
  8. new VegetableShop().cutPotato(new CookLi());
  9. }
  10. }
  11. // 定义接口knife
  12. interface Knife {
  13. //切苹果的能力
  14. void cutApple();
  15. //切番茄的能力
  16. void cutTomato();
  17. //切土豆的能力
  18. void cutPotato();
  19. }
  20. //张厨师类
  21. class CookZhang implements Knife {
  22. @Override
  23. public void cutApple() {
  24. System.out.println("张厨师正在切苹果");
  25. }
  26. @Override
  27. public void cutTomato() {
  28. System.out.println("张厨师正在切番茄");
  29. }
  30. @Override
  31. public void cutPotato() {
  32. System.out.println("张厨师正在切土豆");
  33. }
  34. }
  35. //李厨师类
  36. class CookLi implements Knife {
  37. @Override
  38. public void cutApple() {
  39. System.out.println("李厨师正在切苹果");
  40. }
  41. @Override
  42. public void cutTomato() {
  43. System.out.println("李厨师正在切番茄");
  44. }
  45. @Override
  46. public void cutPotato() {
  47. System.out.println("李厨师正在切土豆");
  48. }
  49. }
  50. /*假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆,两个类张
  51. 厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要
  52. 李师傅来切番茄和切土豆*/
  53. //水果店类
  54. class FruitShop {
  55. // 将接口类型作为参数传入
  56. public void cutApple(Knife knife) {
  57. knife.cutApple();
  58. }
  59. public void cutTomato(Knife knife) {
  60. knife.cutTomato();
  61. }
  62. }
  63. //蔬菜店类
  64. class VegetableShop {
  65. public void cutTomato(Knife knife) {
  66. knife.cutTomato();
  67. }
  68. public void cutPotato(Knife knife) {
  69. knife.cutPotato();
  70. }
  71. }

在这里插入图片描述

案例分析

在这里插入图片描述
1、VegetableShop使用到Knife中两个方法,同样FruitShop也是如此
2、CookZhang,CookLi分别实现Knife这个接口Knifes对于CookZhang,CookLi不是最小的接口,
换句话说CookZhang,CookLi就必须实现他们不需要的方法。导致这个类出现了耦合
这就违反了接口隔离原则(类间的依赖关系应该建立在最小的接口上)

解决方案

解决方案

根据接口隔离原则,我们将Knife拆分为三个独立的接口不就行了吗!
步骤:

  1. 将Knife拆分为AppleKnife,TomatoKinfe,PotatoKnife三个独立的接口
  2. CookZhang(张厨师类 )实现AppleKnife,TomatoKinfe
  3. CookLi(李厨师类)实现TomatoKinfe,PotatoKnife
  4. FruitShop(水果店类)cutApple方法和cutTomato方法分别传入AppleKnife和TomatoKinfe
  5. VegetableShop(蔬菜店类)cutTomato方法和cutPotato方法分别传入TomatoKinfe和PotatoKnife

    public class SegregationDemo {

    1. public static void main(String[] args) {
    2. //水果店类
    3. new FruitShop().cutApple(new CookZhang());
    4. new FruitShop().cutTomato(new CookZhang());
    5. //蔬菜店类
    6. new VegetableShop().cutTomato(new CookLi());
    7. new VegetableShop().cutPotato(new CookLi());
    8. }

    }

    //示例接口隔离原则
    // 将接口knife拆分为三个独立的接口
    interface AppleKnife {

    1. //切苹果的能力
    2. void cutApple();

    }
    interface TomatoKinfe{

    1. //切番茄的能力
    2. void cutTomato();

    }
    interface PotatoKnife{

    1. //切土豆的能力
    2. void cutPotato();

    }

    //张厨师类
    class CookZhang implements AppleKnife,TomatoKinfe {

  1. @Override
  2. public void cutApple() {
  3. System.out.println("张厨师正在切苹果");
  4. }
  5. @Override
  6. public void cutTomato() {
  7. System.out.println("张厨师正在切番茄");
  8. }
  9. }
  10. //李厨师类
  11. class CookLi implements TomatoKinfe,PotatoKnife {
  12. @Override
  13. public void cutTomato() {
  14. System.out.println("李厨师正在切番茄");
  15. }
  16. @Override
  17. public void cutPotato() {
  18. System.out.println("李厨师正在切土豆");
  19. }
  20. }
  21. /*假设有这样一个案例场景,现在有一个接口knife,给定他有三个能力,可以切苹果,切番茄,切土豆,
  22. 两个类张厨师,李厨师分别具有这些能力,有一个水果店类,假设是需要张师傅来切苹果和切番茄,而另一个蔬菜店类需要
  23. 李师傅来切番茄和切土豆*/
  24. //水果店类
  25. class FruitShop {
  26. // 将接口类型作为参数传入
  27. public void cutApple(AppleKnife knife) {
  28. knife.cutApple();
  29. }
  30. public void cutTomato(TomatoKinfe knife) {
  31. knife.cutTomato();
  32. }
  33. }
  34. //蔬菜店类
  35. class VegetableShop {
  36. public void cutTomato(TomatoKinfe knife) {
  37. knife.cutTomato();
  38. }
  39. public void cutPotato(PotatoKnife knife) {
  40. knife.cutPotato();
  41. }
  42. }

案例总结

接口隔离原则就是当我一个类通过接口依赖(使用)另一个类的时候,要保证依赖的该接口是最小的,
接口里面有方法用不到的,就进行隔离,而隔离的做法就是,就对原来接口进行拆分,拆分为最小粒度,来避免耦合

三 与单一职责原则对比

单一职责原则:合理的职责分解,一个类只负责一项职责
接口隔离原则:类间的依赖关系应该建立在最小的接口上

相同点
都要求对结构进行拆分,都要求更小的粒度,都希望减少耦合

不同点
审视角度的不同

单一职责原则:类与接口职责单一,注重的是职责
接口隔离原则:要求我们尽量使用多个专门的接口,注重的是接口的设计

我们使用接口隔离原则进行接口拆分的时候,要遵循单一职责原则

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计原则接口隔离原则

    tip: 需要《设计模式之禅》的书籍,可以联系我 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。