设计模式之禅笔记--面向对象设计六大原则之四

第四章  接口隔离原则(ISR)

定义:

接口分为两种:

实例接口( Object Interface) , 在Java中声明一个类, 然后用new关键字产生一个实例, 它是对一个类型的事物的描述,这是一种接口。 Java的类也是一种接口

n  比如你定义Person这个类, 然后使用Person zhangSan=new Person()产生了一个实例,这个实例要遵从的标准就是Person这个类, Person类就是zhangSan的接口。

l  类接口( Class Interface) , Java中经常使用的interface关键字定义的接口。

思考:Python没有Interface,但可以用实例接口的概念,也就是定义一个类作为接口。

 

接口隔离的两种定义:

l  Clientsshould not be forced to depend upon interfaces that they don't use.( 客户端不应该依赖它不需要的接口。)

l  Thedependency of one class to another one should depend on the smallest possibleinterface.( 类间的依赖关系应该建立在最小的接口上。 )

接口隔离的解释:

l  建立单一接口, 不要建立臃肿庞大的接口。或者说接口尽量细化,同时接口中的方法尽量少。

l  单一职责要求的是类和接口职责单一, 注重的是职责, 这是业务逻辑上的划分, 而接口隔离原则要求接口的方法尽量少

n  例如一个接口的职责可能包含10个方法, 这10个方法都放在一个接口中, 并且提供给多个模块访问, 各个模块按照规定的权限来访问, 在系统外通过文档约束“不使用的方法不要访问”, 按照单一职责原则是允许的, 按照接口隔离原则是不允许的,因为它要求“尽量使用多个专门的接口”。 专门的接口指提供给每个模块的都应该是单一接口, 提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口, 容纳所有的客户端访问。

l  接口是我们设计时对外提供的契约, 通过分散定义多个接口, 可以预防未来变更的扩散, 提高系统的灵活性和可维护性。

例子1:

下图没有接口隔离,但遵守了DIP规则的类图:


优化后有接口隔离,也遵守了DIP规则的类图:

 

需要优化的原因是:美女的定义也在变化。

l  IPettyGirl接口拆分为两个接口, 一种是外形美的美女IGoodBodyGirl, 这类美女的特
点就是脸蛋和身材极棒, 超一流, 但是没有审美素质, 比如随地吐痰, 文化程度比较低; 另外一种是气质美的美女IGreatTemperamentGirl,谈吐和修养都非常高。

例子2:

l  下图没有接口隔离,但部分遵守了DIP规则的类图:


l  优化后遵守接口隔离,但部分遵守了DIP规则的类图:

解释:

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

1)  接口要尽量小。

n  根据接口隔离原则拆分接口时, 必须满足单一职责原则,也就不能小于最小业务逻辑

2)  接口要高内聚

n  高内聚就是提高接口、 类、 模块的处理能力,减少对外的交互。 具体到接口隔离原则就是, 要求在接口中尽量少公布public方法, 接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险也就越少, 同时也有利于降低成本

3)  定制服务

n  一个系统或系统内的模块之间必然会有耦合,有耦合就要有相互访问的接口, 我们设计时就需要为各个访问者( 即客户端) 定制服务。

n  定制服务就是单独为一个个体提供优良的服务。采用定制服务就必然有一个要求:只提供访问者需要的方法.

n  例如:

 


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

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

最佳实践

在实践中可以根据以下几个规则来衡量:

l  一个接口只服务于一个子模块或业务逻辑

l  通过业务逻辑压缩接口中的public方法,接口时常去回顾, 尽量让接口达到“满身筋骨肉”, 而不是“肥嘟嘟”的一大堆方法;

l  已经被污染了的接口, 尽量去修改, 若变更的风险较大, 则采用适配器模式进行转化处理;

l  了解环境, 拒绝盲从。

n  每个项目或产品都有特定的环境因素, 别看到大师是这样做的你就照抄。千万别, 业务逻辑不同, 接口拆分的标准就不同。

如何正确地使用接口隔离原则呢?

l  答案是根据经验和常识决定接口的粒度大小, 接口粒度太小, 导致接口数据剧增, 开发人员呛死在接口的海洋里;接口粒度太大, 灵活性降低, 无法提供定制服务, 给整体项目带来无法预料的风险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值