一、概念

  • 客户端不应该依赖它不需要的接口;
  • 一个类对另一个类的依赖应该建立在最小的接口上。

简单理解,就是不要在一个接口中定义太多的方法,这样这个接口会显得非常臃肿。接口应该细分到对应一个功能模块,不能建立一个大的接口将很多客户端要用的方法都写在一个接口中。

与单一职责原则区别:

接口隔离原则和单一职责原则的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分,而接口隔离原则要求方法要尽可能的少,是在接口设计上的考虑。

二、示例

下面举一个违反接口隔离原则的示例,代码如下:

public class Person {public static void main(String[] args) {Women women = new Women();women.eat();women.run();women.wearSkirt();women.growBeard();System.out.println("==========");Men men = new Men();men.eat();men.run();men.wearSkirt();men.growBeard();}
}/*** 人的一些特性对应的接口*/
interface PersonCharacter {/*** 跑步*/public void run();/*** 穿裙子*/public void wearSkirt();/*** 吃饭*/public void eat();/*** 长胡子*/public void growBeard();}class Women implements PersonCharacter {@Overridepublic void run() {System.out.println("女生跑步...");}@Overridepublic void wearSkirt() {System.out.println("女生穿裙子...");}@Overridepublic void eat() {System.out.println("女生吃饭...");}@Overridepublic void growBeard() {// 女生生的特质正常来说不应该包括长胡子,该方法对于类Women来说是没用的,Women并不需要实现这个无用的方法}}class Men implements PersonCharacter {@Overridepublic void run() {System.out.println("男生跑步...");}@Overridepublic void wearSkirt() {// 男生的特质正常来说不应该包括穿裙子,该方法对于类Men来说是没用的, Men并不需要实现这个无用的方法}@Overridepublic void eat() {System.out.println("男生吃饭...");}@Overridepublic void growBeard() {System.out.println("男生长胡子...");}
}

以上代码的类图大概如下:

运行结果:

可以看到,女生不可能有长胡子这个特性,男生也不可能有穿裙子这个特性,如果将所有的方法都写在一个接口中的话供所有客户端使用的话,那么这个接口显得有些臃肿,需要进行拆分。

三、优化

将接口拆分为三个独立的接口,让客户端只实现需要的方法即可,代码如下:

public class Person {public static void main(String[] args) {Women women = new Women();women.eat();women.run();women.wearSkirt();System.out.println("==========");Men men = new Men();men.eat();men.run();men.growBeard();}
}/*** 人的基础特性对应的接口*/
interface PersonBasicCharacter {/*** 跑步*/public void run();/*** 吃饭*/public void eat();}/*** 女生特有的特性对应的接口*/
interface WomenCharacter {/*** 穿裙子*/public void wearSkirt();
}/*** 男生特有的特性对应的接口*/
interface MenCharacter {/*** 长胡子*/public void growBeard();
}/*** 只需要让女生实现需要的一些方法即可,即不会依赖它不需要的方法growBeard()*/
class Women implements PersonBasicCharacter, WomenCharacter {@Overridepublic void run() {System.out.println("女生跑步...");}@Overridepublic void wearSkirt() {System.out.println("女生穿裙子...");}@Overridepublic void eat() {System.out.println("女生吃饭...");}}/*** 只需要让男生实现需要的一些方法即可,即不会依赖它不需要的方法wearSkirt()*/
class Men implements PersonBasicCharacter, MenCharacter {@Overridepublic void run() {System.out.println("男生跑步...");}@Overridepublic void eat() {System.out.println("男生吃饭...");}@Overridepublic void growBeard() {System.out.println("男生长胡子...");}
}

优化之后的类图大概如下:

运行结果:

四、总结

在实际项目中,要确保一个接口中的方法不能过于太多,这样会导致实现该接口的类可能并不需要某些方法,适当地进行拆分接口,能降低模块之间的耦合,方便后期功能扩展等等。

以下是接口隔离原则的优缺点:

优点:

  • 1. 解耦,降低模块之间的耦合度;
  • 2. 避免接口污染;
  • 3. 提高扩展性,接口细分有助于后期扩展新功能;
  • 4. 实现高内聚:提高接口,类,模块的处理能力,减少对外的交互;
  • 5. 定制服务: 单独为一个个体提供优良服务(只提供访问者需要的方法)

缺点:

  • 如果接口拆分的非常细,可能会导致接口大爆炸,所以接口拆分需把握一个度,具体需要根据项目业务场景分析来定。

软件设计原则(二) 接口隔离原则相关推荐

  1. 软件设计原则之接口隔离原则、合成复用原则、迪米特原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...

  2. 六大设计原则之接口隔离原则

    接口隔离原则定义 接口隔离有两种定义: Clients should not be forced to depend upon interfaces that they don't use. 客户端不 ...

  3. 七大设计原则之接口隔离原则应用

    目录 1 接口隔离原则介绍 2 接口隔离原则应用 1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接 ...

  4. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...

  5. 面向对象编程原则(07)——接口隔离原则

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...

  6. 单一职责原则和接口隔离原则区别的理解

    网上对于两者的区别众说纷纭,总是一套理论下来跟没有说一样,下面说说自己的理解:  单一职责原则: 是将某一职责的方法全放在一个接口中,这时候就会出现实现该接口的类必须实现该接口中自己用不到的方法(违背 ...

  7. 面向对象设计原则之接口隔离原则

    接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...

  8. 软件设计模式六大原则之四接口隔离原则(PHP语言实现)

    转载,原文链接https://www.cnblogs.com/zhanghengscnc/p/8299459.html 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口 ...

  9. 6大设计原则之接口隔离原则

    接口隔离原则的定义 什么是接口. 实例接口,比如定义了一个Person类,然后 Person p = new Pserson(); 产生一个实例,Person类就是 p 的接口 类接口,就是Java中 ...

  10. 七大设计原则之接口隔离原则

    一.接口隔离原则介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上.初看这个定义,让人摸不着头脑,我们看一个类图,看如下图所示: 类A通过接口Interface1依赖 ...

最新文章

  1. 把「光」存储1小时,中科大新研究破世界纪录,保真度高达96.4% | Nature子刊
  2. Xftp5解决“要继续使用此程序,您必须应用最新的更新或使用新版本”
  3. 测试集没标签,可以拿来测模型吗?
  4. 试试把OJ题意抽象成物理模型(洛谷P1007题题解,Java语言描述)
  5. CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇
  6. 美橙互联域名与其他地方的区别
  7. sql crud_使用适用于SQL Server的Python SQL库执行CRUD操作
  8. 数据结构之算法与线性表
  9. 2022年华为杯中国研究生数学建模竞赛C题思路
  10. 国企转型----北京市供销社探索大数据之路!
  11. [电脑桌面壁纸]macOS Big Sur 桌面壁纸分享
  12. 初学C语言,可能需要的软件及下载方式
  13. SnifferProDynamipsGUI环境构建
  14. [渝粤教育] 西南科技大学 广告学 在线考试复习资料
  15. 区块链毕业设计必读论文【2020-5】
  16. 小程序 function(res)与(res) =的区别
  17. 英语六级作文单词、例句总结
  18. 案例 | 中央企业数字化转型实践
  19. Android 5.1以上双卡指定sim卡拨打电话
  20. C 语言 宏定义 :字符串化 stringify 的应用

热门文章

  1. 机器学习- 吴恩达Andrew Ng Week5 神经网络学习Neural Networks Learning知识总结
  2. 翻译:where在Swift中的用法
  3. 图数据库实战 AWS Neptune Gremlin CloudFormation
  4. NumPy库---Axis理解
  5. 193.有效电话号码
  6. List之LinkedList与ArrayList区别
  7. python编程符号大全_2020 年最值得学习的 5 大 AI 编程语言
  8. python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
  9. appscan无法连接到服务器_GTA5无法连接R星服务器怎么解决?无法连接解决方法
  10. 基于DL的目标检测技术:R-CNN、Fast R-CNN、Faster R-CNN