在讲接口隔离原则之前,先明确一下我们的主角——接口。接口分为两种:

◇ 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生的一个实例,它是对一个类型的事物的描述,这是一种接口,比如你定义Person这个类,然后使用Person zhangSan = new Person()产生了一个实例,这个实例要遵从的标准就是Person这个类,Person类就是zhangSan的接口,疑惑?看不懂?不要紧,那是因为让Java语言浸染的时间太长了,只要知道从这个角度来看,Java中的类也是一种接口; 
◇ 类接口(Class Interface),Java中经常使用的interface关键字定义的接口。 
        主角已经定义清楚了,那什么是隔离呢?它有两种定义,如下所示: 
◇ “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 interface”——类间的依赖关系应该建立在最小的接口上。 
        新事物的定义一般都比较难理解,晦涩难懂是正常的。我们把这两个定义剖析一下,先说第一种定义:“客户端不应该依赖它不需要接口”,那依赖什么?依赖它需要的接口,客户端需要什么接口就提供什么接口,把不需要的接口剔除掉,那就需要对接口进行细化,保证其纯洁性;再看第二个定义:“类间的依赖关系应该建立在最小的接口上”,它要求是最小的接口,也是要求接口细化,接口纯洁,与第一个定义如出一辙,只是一个事物的两种不同描述。 
       我们可以把这两个定义概括为一句话:建立单一接口,不要建立臃肿庞大的接口。再通俗一点讲:接口尽量细化,同时接口中的方法尽量少。看到这里大家有可能要疑惑了,这与单一职责原则不是相同的吗?错,接口隔离原则与单一职责的审视角度是不相同的,单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少。例如一个接口的职责可能包含10个方法,这10个方法都放在一个接口中,并且提供给多个模块访问,各个模块按照规定的权限来访问,在系统外通过文档约束“不使用的方法不要访问”,按照单一职责原则是允许的,按照接口隔离原则是不允许的,因为它要求“尽量使用多个专门的接口”,专门的接口指什么?就是指提供给每个模块都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。

Interface Segregation Principle:

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 interface.——类间的依赖关系应建立在最小的接口上。

即,接口尽量细化,接口中的方法尽量少

问题由来:

类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法

解决方案:

将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。包含4层含义:

      1)接口要尽量小

不能出现Fat Interface;但是要有限度,首先不能违反单一职责原则(不能一个接口对应半个职责)。

        2)接口要高内聚

在接口中尽量少公布public方法。

接口是对外的承诺,承诺越少对系统的开发越有利。

       3)定制服务

只提供访问者需要的方法。例如,为管理员提供IComplexSearcher接口,为公网提供ISimpleSearcher接口。

       4)接口的设计是有限度的

建议:

  • 一个接口只服务于一个子模块或业务逻辑;
  • 通过业务逻辑压缩接口中的public方法;
  • 已被污染了的接口,尽量去修改;若变更的风险较大,则采用适配器模式转化处理;
  • 拒绝盲从

与单一职责原则的区别:

二者审视角度不同;

单一职责原则要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分;

接口隔离原则要求接口的方法尽量少。。。

软件设计原则(五)接口隔离原则 -Interface Segregation Principle相关推荐

  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. 【软件架构设计原则】单一职责原则和接口隔离原则

    文章目录 软件架构设计原则 单一职责原则 接口隔离原则 其他设计原则 软件架构设计原则 本文通过实例来讲解 单一职责原则 接口隔离原则 单一职责原则 单一职责(Simple Responsibilit ...

最新文章

  1. EXPDP 时ORA-27054 问题处置
  2. 凡客诚品成都研发中心招聘.net开发经理
  3. 思必驰携手博泰,共创智能汽车新声代
  4. Cisco IPSec *** Gre over --- SVTI
  5. nginx应用领域分类+事件模型
  6. 有关eclipse for java ee版本遇到的坑( Context initialization failed)
  7. 第四章、PL/SQL基础
  8. 赵学军: 理想主义者的下一城
  9. Web前端开发技术(第3版)储久良 12.6综合实例
  10. Tomcat下访问HTML页面乱码的解决方法
  11. win10专业版激活时提示无法连接到internet怎么办?
  12. android7.1以太网动态ip,可以这样解决win10/8.1/7中的WIFI或以太网”没有有效的ip配置”问题 | MOS86...
  13. android 9.0 app应用安装白名单
  14. calcite查询mysql_Apache Calcite教程-SQL解析-Calcite SQL解析
  15. allegro如何删除没有网络的走线,查还没有连的网络线
  16. jquery.webcam.js实现调用摄像头拍照兼容各个浏览器
  17. 2、bq Evaluation Software电流监测工具使用说明
  18. 陕西广电 HGU B1 光猫获取超级密码方法汇总
  19. Win11正式发布,新功能炸裂!
  20. Java SE 基础篇总结 (下)

热门文章

  1. Spring容器创建过程
  2. java虚拟机的俩种异常
  3. 怎么用git将本地代码上传到远程服务器_git命令 将本地代码上传到远程服务器...
  4. 第一个linux桌面,Ubuntu 4.10 “Warty Warthog”:回顾第一个Ubuntu Linux桌面
  5. centos mysql 安装 yum源_Linux - CentOS 7 通过Yum源安装 MySql 5.7
  6. 修改Mysql表中自增字段的初始值
  7. MySQL-日志、完全备份恢复和增量备份恢复
  8. samba 端口_无需公网IP,易有云支持SAMBA远程连接家里设备
  9. python类定义中、对象字符串的特殊方法是_python中自定义类对象json字符串化的方法_python json转字符串、...
  10. wxif 判断字符串相等_ES6:字符串、数组、对象的扩展