接口隔离原则的定义

接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。

2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。

以上两个定义的含义是:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

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

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

接口隔离原则的优点

接口隔离原则是为了约束接口、降低类对接口的依赖性,遵循接口隔离原则有以下 5 个优点。

  1. 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
  2. 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
  3. 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。
  4. 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
  5. 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。

接口隔离原则的实现方法

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

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

下面以学生成绩管理程序为例介绍接口隔离原则的应用。

【例1】学生成绩管理程序。

分析:学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理,正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中,其类图如图 1 所示。


图1 学生成绩管理程序的类图

程序代码如下:

  1. package principle;
  2. public class ISPtest
  3. {
  4. public static void main(String[] args)
  5. {
  6. InputModule input =StuScoreList.getInputModule();
  7. CountModule count =StuScoreList.getCountModule();
  8. PrintModule print =StuScoreList.getPrintModule();
  9. input.insert();
  10. count.countTotalScore();
  11. print.printStuInfo();
  12. //print.delete();
  13. }
  14. }
  15. //输入模块接口
  16. interface InputModule
  17. {
  18. void insert();
  19. void delete();
  20. void modify();
  21. }
  22. //统计模块接口
  23. interface CountModule
  24. {
  25. void countTotalScore();
  26. void countAverage();
  27. }
  28. //打印模块接口
  29. interface PrintModule
  30. {
  31. void printStuInfo();
  32. void queryStuInfo();
  33. }
  34. //实现类
  35. class StuScoreList implements InputModule,CountModule,PrintModule
  36. {
  37. private StuScoreList(){}
  38. public static InputModule getInputModule()
  39. {
  40. return (InputModule)new StuScoreList();
  41. }
  42. public static CountModule getCountModule()
  43. {
  44. return (CountModule)new StuScoreList();
  45. }
  46. public static PrintModule getPrintModule()
  47. {
  48. return (PrintModule)new StuScoreList();
  49. }
  50. public void insert()
  51. {
  52. System.out.println("输入模块的insert()方法被调用!");
  53. }
  54. public void delete()
  55. {
  56. System.out.println("输入模块的delete()方法被调用!");
  57. }
  58. public void modify()
  59. {
  60. System.out.println("输入模块的modify()方法被调用!");
  61. }
  62. public void countTotalScore()
  63. {
  64. System.out.println("统计模块的countTotalScore()方法被调用!");
  65. }
  66. public void countAverage()
  67. {
  68. System.out.println("统计模块的countAverage()方法被调用!");
  69. }
  70. public void printStuInfo()
  71. {
  72. System.out.println("打印模块的printStuInfo()方法被调用!");
  73. }
  74. public void queryStuInfo()
  75. {
  76. System.out.println("打印模块的queryStuInfo()方法被调用!");
  77. }
  78. }

程序的运行结果如下:

输入模块的insert()方法被调用!
统计模块的countTotalScore()方法被调用!
打印模块的printStuInfo()方法被调用!

转载于:https://www.cnblogs.com/sallyiszxm/p/10979640.html

接口隔离原则——面向对象设计原则相关推荐

  1. 8.接口隔离原则——面向对象设计原则

    面向对象设计原则除了开闭原则.里氏替换原则.依赖倒置原则和单一职责原则以外,还有接口隔离原则.迪米特法则和合成复用原则.本节将详细介绍接口隔离原则. 接口隔离原则的定义 接口隔离原则(Interfac ...

  2. 依赖倒置原则——面向对象设计原则

    前两节我们详细介绍了面向对象设计原则中的开闭原则和里氏替换原则,在本节中我们来介绍依赖倒置原则. 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP ...

  3. 开闭原则——面向对象设计原则,使用开闭原则解决实际问题

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.我们将在下面的几节中依次来介绍 ...

  4. 里氏替换原则——面向对象设计原则

    里氏替换原则的定义 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立 里氏替换原则抓哟阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的道理.里氏替 ...

  5. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  6. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  7. 02面向对象设计原则

    技术交流QQ群:1027579432,欢迎你的加入! 1.为什么需要面向对象设计 变化是复用的天敌!面向对象设计最大的优势在于抵御变化! 2.重新认识面向对象 理解隔离变化 从宏观层面上来看,面向对象 ...

  8. 程序员必备的七大面向对象设计原则(三)

    五.接口隔离原则 1. 定义 i.  客户端不应该依赖那些它不需要的接口. ii.  一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可. 2.分析 i. ...

  9. C++面向对象设计原则详解

    概述 C++面向对象设计原则主要包括以下几点: 依赖倒置原则 开放封闭原则 单一职责原则 里氏替换原则 接口隔离原则 封装变化点原则 面向接口编程原则 优先使用对象组合,而不是类继承 接下来详细的分析 ...

最新文章

  1. Mybatis系列:解决foreach标签内list为空的问题
  2. Redis笔记整理(三):进阶操作与高级部分
  3. Floodlight之 FloodlightContextStore 数据结构
  4. vivado SOC——hello word(上)建立SOC系统
  5. 嵌入式Linux学习问题解决记录
  6. ZooKeeper官方文档资源
  7. luncene 查询字符串的解析—QueryParser类
  8. Python进程multiprocessing. Process()的使用
  9. java的HTML5常量用final说明
  10. 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白
  11. maven缺失ojdbc6解决方案 :Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
  12. GIS开发实习地图符号图式制作
  13. VS2003版本Jsoncpp的配置和使用
  14. micro hdmi引脚定义义_臻实力芯定义:京东AMD笔记本电脑双11开门红
  15. CallBack函数调用
  16. Vue 基础之常用内置指令
  17. Japanese Student Championship 2021 D - Nowhere P(递推 + 快速幂)
  18. 新浪cn邮箱设置收件和发件服务器信息,新浪cn邮箱如何设置
  19. 【天光学术】财务会计论文:家电连锁零售企业财务分析方法与注意问题(节选)
  20. 西北乱跑娃 --- python excel表合并

热门文章

  1. JavaScript或jQuery中使用键盘控制对象运动
  2. 痞子衡嵌入式:第一本Git命令教程(0)- 索引
  3. Laravel 5.0 - Middleware (中间件)
  4. Exception在语义上的处理。在系统中的意义。
  5. OpenOffice java api UNO 设置属性总结
  6. tornado的资料(暂时没看)
  7. 云计算与springCloud概念上的区别
  8. Java EE的三层架构
  9. 什么是1st tier conference?
  10. SVM入门(八)松弛变量(转)