【设计模式】接口隔离原则

以下内容来自《Java设计模式》

1 接口隔离原则

接口隔离原则定义如下:

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

根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接 口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干 不该干的事,该干的事都要干。这里的“接口”往往有两种不同的含义:一种是指一个类型所具 有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的“接口”定义, 有严格的定义和结构,比如Java语言中的interface。对于这两种不同的含义,ISP的表达方式以 及含义都有所不同:

  • 当把“接口”理解成一个类型所提供的所有方法特征的集合的时候,这就是一种逻辑上的概 念,接口的划分将直接带来类型的划分。可以把接口理解成角色,一个接口只能代表一个角 色,每个角色都有它特定的一个接口,此时,这个原则可以叫做“角色隔离原则”。

  • 如果把“接口”理解成狭义的特定语言的接口,那么ISP表达的意思是指接口仅仅提供客户端 需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口, 而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的 所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口 中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便, 并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只 包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即 为不同的客户端提供宽窄不同的接口。

2 案例分析

下面通过一个简单实例来加深对接口隔离原则的理解:

Sunny软件公司开发人员针对某CRM系统的客户数据显示模块设计了如图1所示接口,其中方 法dataRead()用于从文件中读取数据,方法transformToXML()用于将数据转换成XML格式,方 法createChart()用于创建图表,方法displayChart()用于显示图表,方法createReport()用于创建文 字报表,方法displayReport()用于显示文字报表。


初始设计方案结构图

在实际使用过程中发现该接口很不灵活,例如如果一个具体的数据显示类无须进行数据转换 (源文件本身就是XML格式),但由于实现了该接口,将不得不实现其中声明的transformToXML()方法(至少需要提供一个空实现);如果需要创建和显示图表,除了需实现 与图表相关的方法外,还需要实现创建和显示文字报表的方法,否则程序编译时将报错。

现使用接口隔离原则对其进行重构。

在图1中,由于在接口CustomerDataDisplay中定义了太多方法,即该接口承担了太多职责,一 方面导致该接口的实现类很庞大,在不同的实现类中都不得不实现接口中定义的所有方法, 灵活性较差,如果出现大量的空方法,将导致系统中产生大量的无用代码,影响代码质量; 另一方面由于客户端针对大接口编程,将在一定程序上破坏程序的封装性,客户端看到了不 应该看到的方法,没有为客户端定制接口。因此需要将该接口按照接口隔离原则和单一职责 原则进行重构,将其中的一些方法封装在不同的小接口中,确保每一个接口使用起来都较为 方便,并都承担某一单一角色,每个接口中只包含一个客户端(如模块或类)所需的方法即 可。

通过使用接口隔离原则,本实例重构后的结构如图2所示:

重构后结构图

在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系 统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较 差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强 迫客户依赖于那些它们不用的方法。

3 设计模式的七大原则

【设计模式】单一职责原则
【设计模式】开闭原则
【设计模式】里氏替换原则
【设计模式】依赖倒转原则
【设计模式】接口隔离原则
【设计模式】合成复用原则
【设计模式】迪米特法则

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 先扯两句 其实今天还真没什么可扯的部分,之所以保留这个部分,单纯的就是为了发一下《设计模式》——目录,然后让我们进...
    半寿翁阅读 374评论 0 1
  • 设计模式原则 - 接口隔离原则 寂然 大家好,我是寂然~,本节课呢,我来给大家介绍设计模式原则之接口隔离原则,话不...
    _寂然阅读 232评论 0 0
  •   注意:如果不想浪费时间,请一定要点我。 定义  接口隔离原则,要求程序员尽量将庞大臃肿的接口分离出更小和更具体...
    布鲁斯理阅读 276评论 0 0
  • 相关链接:0. 设计模式之六大原则总结1. 设计模式之单一职责原则2. 设计模式之里式替换原则3. 设计模式之依赖...
    沉江小鱼阅读 559评论 0 1
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,721评论 0 5