面向对象设计原则:接口隔离原则(The Interface Segregation Principle)

来源:互联网 发布:网络装修平台哪家好 编辑:程序博客网 时间:2024/06/05 15:29

热爱生活,享受娱乐,专注技术,欢迎关注微信公众号QGer,我们一起见证成长!


什么是接口隔离原则?

  •      官方解释:客户端不应该依赖它不需要的接口,使用户指定的类建立在最小粒度上。
  •      通俗解释:定义接口的时候,在不违背单一职责原则的情况下,接口尽可能建立在最小粒度上,即尽可能细化接口,是接口变得单一。
为什么遵循接口隔离原则?
  •      接口尽量小时,防止出现接口臃肿,抽象不彻底,代码利用率低的情况。
  •      为用户指定的类提供定制服务,只暴露给用户所需的接口方法,对于不需要的方法则是透明的,使得依赖关系单一,容易管理。
  •      越少的接口暴露则表明类越内聚,对外的交互越单一,变更所产生的风险和成本也越低。
如何遵循接口隔离原则?
     比如,现在我新建了一个球员类YaoMing,假设姚明的主要能力有二分、扣篮、勾手、传球。以及另一个球员类McGrady,假设麦迪的主要能力有二分、三分、扣篮、勾手、背后运球、变向运球、传球。然后我抽象了一个接口 BasketBallAction,如下:

红点代表姚明的能力,蓝点代表麦迪的能力,那么此时很明显,对于YaoMing依赖与BasketBallActionImpl,此时有三个接口是BasketBallActionImpl必须实现但YaoMing又不需要用到的。而对于McGrady依赖与BasketBallActionImpl,此时有一个接口是BasketBallActionImpl必须实现但McGrady又不需要用到的。那么在这样的情况下,BasketBallAction接口的设计就显然违背了接口隔离原则。

可以有另一种设计方案:

红点代表姚明的能力,蓝点代表麦迪的能力,此时抽象出来的接口显得很单一又专注,并不显得臃肿,可扩展性、维护性也有所提高。有人会说这里的ShotAction也有双方各自用不到的接口呀,这里其实我设计另一个完全单一的接口也是可以的,但我想表明的是,此时的ShotAction设计在抽象层次上已经是属于仅负责一种职责:投篮得分,在符合单一职责原则下,接口要适度,不要过度细化。接口只能说是尽可能小,但是过于细化也会造成类过多,变得复杂化。
     最后强调一点,单一职责原则与接口隔离原则表面上看起来似乎很相似,其实不然。单一职责注重的是“职责”,是代码功能实现上的隔离,而接口隔离原则注重的是对接口的隔离,针对底层抽象层次上接口的的隔离。


     
0 0