设计模式-接口隔离原则(4)

设计原则

单一职责原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
开闭原则

接口隔离原则定义

接口分为2种:

● 实例接口(Object Interface) , 在Java中声明一个类, 然后用new关键字产生一个实例, 它是对一个类型的事物的描述, 这是一种接口。 比如你定义Person这个类, 然后使用Person zhangSan=new Person()产生了一个实例, 这个实例要遵从的标准就是Person这个类, Person类就是zhangSan的接口。 疑惑? 看不懂? 不要紧, 那是因为让Java语言浸染的时间太长了, 只要知道从这个角度来看, Java中的类也是一种接口。
● 类接口(Class Interface) , Java中经常使用的interface关键字定义的接口

那什么是隔离呢? 

客户端不应该依赖它不需要的接口;
类间的依赖关系应该建立在最小的接口上。

第一种定义: “客户端不应该依赖它不需要的接口”, 那依赖什么? 依赖它需要的接口, 客户端需要什么接口就提供什么接口, 把不需要的接口剔除掉, 那就需要对接口进行细化, 保证其纯洁性;
第二种定义: “类间的依赖关系应该建立在最小的接口上”, 它要求是最小的接口, 也是要求接口细化, 接口纯洁, 与第一个定义如出一辙, 只是一个事物的两种不同描述。
两个定义概括为一句话: 建立单一接口, 不要建立臃肿庞大的接口。 通俗一点讲: 接口尽量细化, 同时接口中的方法尽量少。

接口隔离和单一职责区别?

看到这里大家有可能要疑惑了, 这与单一职责原则不是相同的吗? 错, 接口隔离原则与单一职责的审视角度是不相同的。
单一职责要求的是类和接口职责单一, 注重的是职责, 这是业务逻辑上的划分, 而接口隔离原则要求接口的方法尽量少。
举例说明接口隔离和单一职责区别:

图书查询接口的职责包含5个方法,4个简单查询和1个复杂查询, 这5个方法都放在一个接口中, 并且提供给多个模块访问, 各个模块按照规定的权限来访问, 有的系统可以访问简单查询,有的系统可以访问复杂查询, 按照单一职责原则是允许的, 按照接口隔离原则是不允许的,因为它不能满足“最小接口”的隔离原则。
图书查询没有给模块提供单一接口, 应该是提供给几个模块就应该有几个接口, 而不是建立一个庞大的臃肿的接口, 容纳所有的客户端访问。
把这个接口进行重构, 将IBookSearcher拆分为两个接口, 分别为两个模块提供定制服务:


同时实现了ISimpleBookSearcher和IComplexBookSearcher两个接口, 原有程序不用做任何改变, 根据系统权限, 单独为模块其定制服务,开放接口,减少可能引起的风险。这样同时满足单一职责原则和接口隔离原则。
 

在举一个例子说明接口隔离:

首先定义一下什么是美女,要成为一名美女就必须具备, 面貌、 身材和气质。

当然, 随着时代的发展我们的审美观也在变化, 当你发现有一个女孩,脸蛋不怎么样, 身材也一般般, 但是气质非常好, 我相信大部分人都会把这样的女孩叫美女, 审美素质提升了, 就产生了气质型美女, 但是我们的接口却定义了美女必须是三者都具
备, 按照这个标准, 气质型美女就不能算美女, 那怎么办? 可能你要说了, 我重新扩展一个美女类, 只实现greatTemperament方法, 其他两个方法置空, 什么都不写, 不就可以了吗?聪明, 但是行不通! 为什么呢? 星探AbstractSearcher依赖的是IPettyGirl接口, 它有三个方法, 你只实现了两个方法, 星探的方法是不是要修改? 我们上面的程序打印出来的信息少了两条, 还让星探怎么去辨别是不是美女呢?
分析到这里, 我们发现接口IPettyGirl的设计是有缺陷的, 过于庞大了, 容纳了一些可变的因素, 根据接口隔离原则, 星探AbstractSearcher应该依赖于具有部分特质的女孩子, 而我们却把这些特质都封装了起来, 放到了一个接口中, 封装过度了! 问题找到了, 我们重新设计一下类图, 修改后的类图:


把原IPettyGirl接口拆分为两个接口, 一种是外形美的美女IGoodBodyGirl, 这类美女的特点就是脸蛋和身材极棒, 超一流, 但是没有审美素质, 比如随地吐痰, 文化程度比较低; 另外一种是气质美的美女IGreatTemperamentGirl, 谈吐和修养都非常高。 我们把一个比较臃肿的接口拆分成了两个专门的接口, 灵活性提高了, 可维护性也增加了, 不管以后是要外形美的美女还是气质美的美女都可以轻松地通过PettyGirl定义。

通过这样的重构以后, 不管以后是要气质美女还是要外形美女, 都可以保持接口的稳定。 当然, 你可能要说了, 以后可能审美观点再发生改变, 只有脸蛋好看就是美女, 那这个IGoodBody接口还是要修改的呀, 确实是, 但是设计是有限度的, 不能无限地考虑未来的变更情况, 否则就会陷入设计的泥潭中而不能自拔。
 

总结

接口隔离原则是对接口进行规范约束, 其包含以下4层含义:

接口要尽量小:这是接口隔离原则的核心定义, 不出现臃肿的接口(Fat Interface) , 但是“小”是有限度
的, 不能违反单一职责原则。

接口要高内聚:要求在接口中尽量少公布public方法, 接口是对外的承诺, 承诺越少对系统的开发越有利, 变更的风险也就越少, 同时也有利于降低成本。

定制服务:一个系统或系统内的模块之间必然会有耦合, 有耦合就要有相互访问的接口,我们设计时就需要为各
个访问者(即客户端) 定制服务, 什么是定制服务? 定制服务就是单独为一个个体提供优良的服务,只提供访问者需要的方法。

接口设计是有限度的:接口的设计粒度越小, 系统越灵活, 这是不争的事实。 但是, 灵活的同时也带来了结构
的复杂化, 开发难度增加, 可维护性降低, 这不是一个项目或产品所期望看到的, 所以接口设计一定要注意适度, 这个“度”如何来判断呢? 根据经验和常识判断, 没有一个固化或可测量的标准。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值