基本介绍

  1. 客户端不应该不依赖它不需要的接口,即一个类对另一个类的依赖(使用调用)应该建立在最小的接口上
  2. 先看一张图:image.png
  3. 类A通过接口Interface1依赖B,类C通过接口Interface1依赖D,如果Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法
  4. 按接口隔离原则应该这样处理:

    接口Interface1拆分成独立的几个接口(这里我们拆分成3个接口),类A和类C分别于他们需要的接口建立依赖关系。也就是接口隔离原则。

应用实例

方案一:

类A通过接口Interface1依赖B,类C通过Interface1依赖D

  1. public class Application {
  2. 这种方式违背了接口隔离原则
  3. 一个类对另一个类的依赖(使用调用)应该建立在最小的接口上
  4. A通过接口Interface1依赖B,那么对于A来说类B就不用实现A不需要的方法同理C也是一样
  5. public static void main(String[] args) {
  6. A a = new A();
  7. a.depend1(new B());
  8. a.depend2(new B());
  9. a.depend3(new B());
  10. C c = new C();
  11. c.depend1(new D());
  12. c.depend4(new D());
  13. c.depend5(new D());
  14. }
  15. }
  16. interface Interface1 {
  17. void operation1();
  18. void operation2();
  19. void operation3();
  20. void operation4();
  21. void operation5();
  22. }
  23. class B implements Interface1 {
  24. @Override
  25. public void operation1() {
  26. System.out.println("类B 实现接口operation1 方法");
  27. }
  28. @Override
  29. public void operation2() {
  30. System.out.println("类B 实现接口operation2方法");
  31. }
  32. @Override
  33. public void operation3() {
  34. System.out.println("类B 实现接口operation3方法");
  35. }
  36. @Override
  37. public void operation4() {
  38. System.out.println("类B 实现接口operation4方法");
  39. }
  40. @Override
  41. public void operation5() {
  42. System.out.println("类B 实现接口operation5方法");
  43. }
  44. }
  45. class D implements Interface1 {
  46. @Override
  47. public void operation1() {
  48. System.out.println("类D 实现接口operation1 方法");
  49. }
  50. @Override
  51. public void operation2() {
  52. System.out.println("类D 实现接口operation2方法");
  53. }
  54. @Override
  55. public void operation3() {
  56. System.out.println("类D 实现接口operation3方法");
  57. }
  58. @Override
  59. public void operation4() {
  60. System.out.println("类D 实现接口operation4方法");
  61. }
  62. @Override
  63. public void operation5() {
  64. System.out.println("类D 实现接口operation5方法");
  65. }
  66. }
  67. class A {
  68. public void depend1(Interface1 interface1){
  69. interface1.operation1();
  70. }
  71. public void depend2(Interface1 interface1){
  72. interface1.operation2();
  73. }
  74. public void depend3(Interface1 interface1){
  75. interface1.operation3();
  76. }
  77. }
  78. class C {
  79. public void depend1(Interface1 interface1){
  80. interface1.operation1();
  81. }
  82. public void depend4(Interface1 interface1){
  83. interface1.operation4();
  84. }
  85. public void depend5(Interface1 interface1){
  86. interface1.operation5();
  87. }
  88. }

运行结果:

  1. "F:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:F:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=50801:F:\Program Files\JetBrains\IntelliJ IDEA 2018.3\bin" -Dfile.encoding=UTF-8 -classpath "F:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\study\study_jvm\target\classes;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;F:\JAVA\Maven\Repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\JAVA\Maven\Repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\JAVA\Maven\Repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;F:\JAVA\Maven\Repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;F:\JAVA\Maven\Repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;F:\JAVA\Maven\Repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\JAVA\Maven\Repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;F:\JAVA\Maven\Repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;F:\JAVA\Maven\Repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;F:\JAVA\Maven\Repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;F:\JAVA\Maven\Repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;F:\JAVA\Maven\Repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;F:\JAVA\Maven\Repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;F:\JAVA\Maven\Repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  2. B 实现接口operation1 方法
  3. B 实现接口operation2方法
  4. B 实现接口operation3方法
  5. D 实现接口operation1 方法
  6. D 实现接口operation4方法
  7. D 实现接口operation5方法

方案二:

  1. 类A通过Interface1依赖B,类C通过Interface1依赖D,如果类A和类C对于Interface1来说不是最小接口的话,那么类B和类D就不必实现他们不需要的方法
  2. 将Interface1分解成几个独立的接口,将类A和类C分别和这几个接口建议依赖关系,也就是采用接口隔离原则即最小接口
  3. 将Interface1接口分解为3个接口

image.png

  1. public class Application {
  2. public static void main(String[] args) {
  3. A a = new A();
  4. a.depend1(new B());
  5. a.depend2(new B());
  6. a.depend3(new B());
  7. C c = new C();
  8. c.depend1(new D());
  9. c.depend4(new D());
  10. c.depend5(new D());
  11. }
  12. }
  13. interface Interface1 {
  14. void operation1();
  15. }
  16. interface Interface2 {
  17. void operation2();
  18. void operation3();
  19. }
  20. interface Interface3 {
  21. void operation4();
  22. void operation5();
  23. }
  24. class B implements Interface1,Interface2 {
  25. @Override
  26. public void operation1() {
  27. System.out.println("类B 实现接口operation1 方法");
  28. }
  29. @Override
  30. public void operation2() {
  31. System.out.println("类B 实现接口operation2方法");
  32. }
  33. @Override
  34. public void operation3() {
  35. System.out.println("类B 实现接口operation3方法");
  36. }
  37. }
  38. class D implements Interface1,Interface3 {
  39. @Override
  40. public void operation1() {
  41. System.out.println("类D 实现接口operation1 方法");
  42. }
  43. @Override
  44. public void operation4() {
  45. System.out.println("类D 实现接口operation4方法");
  46. }
  47. @Override
  48. public void operation5() {
  49. System.out.println("类D 实现接口operation5方法");
  50. }
  51. }
  52. class A {
  53. public void depend1(Interface1 interface1){
  54. interface1.operation1();
  55. }
  56. public void depend2(Interface2 interface2){
  57. interface2.operation2();
  58. }
  59. public void depend3(Interface2 interface2){
  60. interface2.operation3();
  61. }
  62. }
  63. class C {
  64. public void depend1(Interface1 interface1){
  65. interface1.operation1();
  66. }
  67. public void depend4(Interface3 interface3){
  68. interface3.operation4();
  69. }
  70. public void depend5(Interface3 interface3){
  71. interface3.operation5();
  72. }
  73. }

运行结果:

  1. "F:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:F:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=51009:F:\Program Files\JetBrains\IntelliJ IDEA 2018.3\bin" -Dfile.encoding=UTF-8 -classpath "F:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;F:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\study\study_jvm\target\classes;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;F:\JAVA\Maven\Repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\JAVA\Maven\Repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\JAVA\Maven\Repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;F:\JAVA\Maven\Repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;F:\JAVA\Maven\Repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;F:\JAVA\Maven\Repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\JAVA\Maven\Repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;F:\JAVA\Maven\Repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;F:\JAVA\Maven\Repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;F:\JAVA\Maven\Repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;F:\JAVA\Maven\Repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;F:\JAVA\Maven\Repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;F:\JAVA\Maven\Repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;F:\JAVA\Maven\Repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;F:\JAVA\Maven\Repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;F:\JAVA\Maven\Repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;F:\JAVA\Maven\Repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  2. B 实现接口operation1 方法
  3. B 实现接口operation2方法
  4. B 实现接口operation3方法
  5. D 实现接口operation1 方法
  6. D 实现接口operation4方法
  7. D 实现接口operation5方法