设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?

设计了一个内嵌的SimpleHttpServer,输出项目的配置信息到一个固定的HTTP地址
实现了一个ScheduledUpdater类,以固定时间频率来调用RedisConfig、KafkaConfig的update()方法
应该把count()函数拆成几个更小粒度的函数
count()函数的功能不够单一
将删除接口单独放到另外一个接口RestrictedUserService中
后台管理系统要实现删除用户的功能
微服务用户系统提供了一组跟用户相关的API给其他系统使用
java.util.concurrent并发包提供了AtomicInteger这样一个原子类,其中有一个函数getAndIncrement()是这样定义的
接口隔离原则与单一职责原则的区别
如何理解“接口隔离原则”?
把“接口”理解为OOP中的接口概念
把“接口”理解为单个API接口或函数
把“接口”理解为一组API接口集合
课堂讨论
重点回顾
如何理解“接口隔离原则”?
接口隔离原则

该思维导图由 AI 生成,仅供参考

上几节课中,我们学习了 SOLID 原则中的单一职责原则、开闭原则和里式替换原则,今天我们学习第四个原则,接口隔离原则。它对应 SOLID 中的英文字母“I”。对于这个原则,最关键就是理解其中“接口”的含义。那针对“接口”,不同的理解方式,对应在原则上也有不同的解读方式。除此之外,接口隔离原则跟我们之前讲到的单一职责原则还有点儿类似,所以今天我也会具体讲一下它们之间的区别和联系。
话不多说,现在就让我们正式开始今天的学习吧!

如何理解“接口隔离原则”?

接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。Robert Martin 在 SOLID 原则中是这样定义它的:“Clients should not be forced to depend upon interfaces that they do not use。”直译成中文的话就是:客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。
实际上,“接口”这个名词可以用在很多场合中。生活中我们可以用它来指插座接口等。在软件开发中,我们既可以把它看作一组抽象的约定,也可以具体指系统与系统之间的 API 接口,还可以特指面向对象编程语言中的接口等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

接口隔离原则在软件设计中的应用是本文的重点。作者通过三种不同的理解方式来解释接口隔离原则的应用:将“接口”理解为一组API接口集合,将“接口”理解为单个API接口或函数,以及将“接口”理解为OOP中的接口概念。通过具体的例子和代码实现,深入浅出地解释了接口隔离原则的应用和意义。文章通过设计Updater和Viewer两个功能非常单一的接口,实现了热更新和监控的需求。这种设计思路更加灵活、易扩展、易复用,同时避免了无用功。总之,本文通过清晰的技术指导,帮助读者快速了解接口隔离原则在软件设计中的重要性和实际应用。文章还提到了接口隔离原则与单一职责原则的区别,以及针对java.util.concurrent并发包提供的AtomicInteger类中的getAndIncrement()函数是否符合单一职责原则和接口隔离原则的讨论。这些内容为读者提供了深入的技术思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(186)

  • 最新
  • 精选
  • 码到成功
    老师可以每次课对上一次课的思考题做下解答吗

    作者回复: 集中答疑一下吧 课都提前录好了

    2019-12-13
    3
    30
  • 陈拾柒
    为什么觉得老师说的,对于接口的三种理解,第一种理解和第三种理解说的是同一件事情~

    作者回复: 不一样呢你再看看

    2019-12-19
    10
    3
  • 郑自明
    Java8 Interface有default method 这样新加的method不需要所有相关类再实现了。但对这些类而言 不就违背了接口隔离原则么?

    作者回复: 语法归语法,看你怎么用了,这个跟原则不冲突的。

    2020-08-26
  • 庚小庚
    接口隔离原则,如果是从API接口角度,我觉得应该是从实现方来看,比如我实现某个接口,我只想实现这个接口的部分功能,其他功能用不上,那么就要考虑这个接口是否符合隔离原则,能否进行粒度拆分,这样也更灵活,针对函数来讲,应该就是从调用者的角度来看,比如我只想统计商品总量,而其他的统计结果,你不要给我,其实我们现在做的项目,都是前后端分离的,让前端调用,很多时候,我们项目中,会有一个很大的用户接口,包括一大堆信息,但是实际上前端只想获取用户的姓名或则手机号。但是你却给我了一大堆,后端也是为了图方便,只写一个接口,反正所有用户的信息全部塞到里面,那从这个角度,是不是也不符合接口隔离原则呢

    作者回复: 是的,我觉得应该不过过于大而全,但拆的过细也不好,你可以结合着门面模式看下

    2020-07-09
  • 辣么大
    Java.util.concurrent.atomic包下提供了机器底层级别实现的多线程环境下原子操作,相比自己实现类似的功能更加高效。 AtomicInteger提供了 intValue() 获取当前值 incrementAndGet() 相当于++i getAndIncrement相当于i++ 从getAndIncrement实现“原子”操作的角度上来说,原子级别的给整数加一,返回未加一之前的值。它的职责是明确的,是符合单一职责的。 从接口隔离原则上看,也是符合的,因为AtomicInteger封装了原子级别的整数操作。 补充: 多线程环境下如果需要计数的话不需旧的值时,推荐使用LongAdder或者LongAccumulator(CoreJava上说更加高效,但我对比了AtomicLong和LongAdder,没感觉效率上有提高,可能是例子写的不够准确。测试代码见 https://github.com/gdhucoder/Algorithms4/tree/master/designpattern/u18 希望和小伙伴们一起讨论)
    2019-12-13
    15
    159
  • 李小四
    设计模式_18 纯理论分析,这么设计是不符合“接口隔离”原则的,毕竟,get是一个操作,increment是另一个操作。 结合具体场景,Atomic类的设计目的是保证操作的原子性,专门看了一下AtomicInteger的源码,发现没有单独的 increment 方法,然后思考了一下线程同步时的问题,场景需要保证 get 与 increment 中间不插入其他操作,否则函数的正确性无法保证,从场景的角度,它又是符合原则的。
    2019-12-13
    7
    105
  • 星溯
    老师此题大有深意,我们可以从此思考题中方法的设计来深化对单一职责和接口隔离的理解: 接口隔离,强调的是调用方,是否只使用了接口中的部分功能?若是,则违反接口隔离,应当细粒度拆分接口,从这个例子看,调用方诉求与方法名完全一致,通过方法内部封装两个操作,实现原子性,达成了调用方的最终目的,不多不少。 单一职责,不强调是否为调用方,只要能某一角度观察出,一个模块/类/方法,负责了多于一件事情,就可判定其破坏了单一职责,基于此经典理论,不假以深层次思考的角度出发,从方法本身的命名(做两件事)就可断定,它一定是破坏了单一职责的,应该拆分为两个操作。 但我们可以结合老师说的,判定职责是否单一,要懂得结合业务场景,业务需求,此方法,其实就是要通过JDK提供的CAS乐观自选锁(方法最终依赖硬件指令集原语,Compare And Swap)从“原语”这一词的含义看,其实也是同时、原子性地做了一件“完整”的事情,因此,考虑这一点,是可以判定它符合单一职责的。 而这其实正是单一职责判定结果,往往见仁见智的原因:基于不同的角度,不同的立场,不同的业务理解,往往可以得到不同的判定结果,但不必纠结,判定过程中用到的思想才是精髓。
    2021-04-01
    5
    61
  • Geek_e9b8c4
    总结成思维导图了,链接 https://blog.csdn.net/dingshuo168/article/details/103531805
    2019-12-13
    36
  • M
    接口隔离原则:我只要我想要的,不想要的别给我
    2020-02-08
    2
    17
  • 小晏子
    思考题: 先看是否符合单一职责原则,这个函数的功能是加1然后返回之前的值,做了两件事,是不符合单一职责原则的! 但是却符合接口隔离原则,从调用者的角度来看的话,因为这个类是Atomic类,需要的所有操作都是原子的,所以为了满足调用者需要原子性的完成加一返回的操作,提供一个这样的接口是必要的,满足接口隔离原则。
    2019-12-13
    1
    17
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部