面向对象基础设计原则:6.接口隔离原则 通过对前面几个设计原则的讨论,我们会发现接口是一个好东西,因为使用接口,可以使代码灵活性和可维护性更强。但是,在设计接口时,我们还必须遵循接口隔离原则。 接口隔离原则(Interface Segregation Principle,简称ISP)是指客户不应该依赖它们用不到的方法,只给每个客户它所需要的接口。换句话说,就是不能强迫用户去依赖那些他们不使用的接口。 接口隔离原则实际上包含了两层意思:接口的设计原则:接口的设计应该遵循最小接口原则,不要把用户不使用的方法塞进同一个接口里。如果一个接口的方法没有被使用到,则说明该接口过胖,应该将其分割成几个功能专一的接口,使用多个专门的接口比使用单一的总接口要好。接口的继承原则:如果一个接口A继承另一个接口B,则接口A相当于继承了接口B的方法,那么继承了接口B后的接口A也应该遵循上述原则:不应该包含用户不使用的方法。反之,则说明接口A被B给污染了,应该重新设计它们的关系。 如果用户被迫依赖他们不使用的接口,当接口发生改变时,他们也不得不跟着改变。换而言之,一个用户依赖了未使用但被其他用户使用的接口,当其他用户修改该接口时,依赖该接口的所有用户都将受到影响。这显然违反了开闭原则,也不是我们所期望的。 下面我们举例说明怎么设计接口或类之间的关系,使其不违反ISP原则。 假如有一个门(Door),有锁门(lock)和开锁(unlock)功能。此外,可以在门上安装一个报警器而使其具有报警(alarm)功能。用户可以选择一般的门,也可以选择具有报警功能的门。分析需求,找出其中的名词,我们不难得到三个候选类:门(Door)、普通门(CommonDoor)、有报警功能的门(AlarmDoor)。我们该如何设计这三个候选类之间的关系呢? 最简单的设计就是将Door作为接口,在Door接口里定义所有的方法,让CommonDoor和AlarmDoor作为该接口的实现类,从而强制这两个类实现Door接口中的所有方法,如下所示。但这样一来,依赖Door接口的CommonDoor却不得不实现未使用的alarm()方法。很显然,这个Door接口有点肥胖,内聚性太差,违反了接口隔离原则。
太肥胖的接口 那么,好吧,将报警功能从Door中分离出来,封装成一个Alarm接口。在Alarm接口定义alarm()方法,在Door接口定义lock()和unlock()方法,Door接口继承Alarm接口,如下图所示。现在一个接口根据功能分成了两个接口,貌似设计要更好一些。但是,可惜的是:跟第一种方法一样,依赖Door接口的CommonDoor却不得不实现未使用的alarm()方法,也就是说接口Door被接口Alarm“污染”了,这种设计同样违反了接口隔离原则。
接口污染 很显然,太肥胖的接口以及接口污染都会造成用户依赖于他们不用的方法,从而违反了接口隔离原则。我们不应该强迫用户依赖于他们不用的方法。那么,到底如何做才能实现这一点呢?有两种方式:通过多重继承分离接口。多重继承可以有两个方式,第一种方式是同时实现两个接口,属于多重接口继承;第二种方式是实现一个接口,同时继承一个具体类,实际上也是一种多重继承。现在我们继续本例的设计,这次我们为了避免太肥胖的接口以及接口污染,我们在Alarm接口中定义alarm()方法,在Door接口中定义lock()和unlock()方法,这两个接口之间无继承关系。CommonDoor实现Door接口。而AlarmDoor根据多重继承的实现方式,分为两种方案。第一种方案为:AlarmDoor类同时实现Door和Alarm接口,如下图所示。
通过多重继承分离接口方式一第二种方案为:继承CommonDoor,并实现Alarm接口,如下图所示。这两种设计方案都将Door接口和Alarm接口分离了,避免了肥胖的接口和接口污染,都遵循了接口隔离原则,但是第二种方案更具有实用性。
通过多重继承分离接口方式二通过委托分离接口。在这种方法里,AlarmDoor实现了Alarm接口,同时把功能lock和unlock委托给CommonDoor对象完成。这种设计遵循了接口隔离原则。实际上,这种方法是对第三种方法的第二个方案应用了组合/聚合复用原则,将AlarmDoor和CommonDoor的继承关系转换为聚合关系。
通过委托分离接口 接口隔离原则从对接口的使用上,为我们对接口抽象的颗粒度建立了判断基准:在为系统设计接口的时候,使用多个专门的接口代替单一的胖接口。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/65501.html