接口隔离原则讲的是:使用多个专门的接口比使用单一的总接口要好。换言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一、什么是接口隔离原则
人们常说的“接口”往往有两种含义,一种是狭义上的,指的是Java语言中的有严格定义的interface结构;另一种则是广义上的,指的是一个类型所具有的方法特征的集合,但这仅是一种逻辑上的抽象。对于这两种不同的用词,接口隔离原则的表达方式以及含义都有所不同。
①将“接口”理解为一个类所提供的所有方法的特征集合,也就是一种在逻辑上才存在的概念。这样的话,接口的划分就直接带来类型的划分。一种接口相当于剧本中的一种角色,而此角色在一个舞台上由那个演员来演则相当于接口的实现。因此,一个接口应当简单的代表一个角色,而不是多个角色。如果系统涉及到多个角色的话,那么每一个角色都相当于一个特定的接口代表。
②将接口理解成狭义的Java接口,这样一来,接口隔离原则讲的就是为同一个角色提供宽、窄不同的接口,以对付不同的客户端。这种方法在服务行业中叫做定制服务。
二、接口污染
过于臃肿的接口是对接口的污染。每一个接口都代表一个角色,实现一个接口的对象,在他的整个生命周期中都扮演这个角色,因此将角色区分清楚就是系统设计的一个重要工作。一个符合逻辑的推断,不应当将几个不同的角色交给同一个接口,而应当交给不同的接口。
准确而恰当的划分角色以及角色所对应的接口,是面向对象的设计的一个重要的组成部分。将没有关系的接口合并在一起,形成一个臃肿的大接口,是对角色和接口的污染。
三、与迪米特法则的关系
迪米特法则要求任何一个软件实体,除非绝对需要,不然不要与外界通讯。即使必须进行通讯,也应当尽量限制通讯的广度和深度。显然,定制服务原则拒绝向客户端提供不需要提供的行为,是符合迪米特法则的。
四、定制服务的例子
定制服务也是一个重要的设计原则。他的意思是说,如果客户端仅仅需要一些方法的话,那么就应当向客户端提供这些需要的方法,而不是提供不需要的方法。
这样做有什么效果?
①这样做很整洁。从美学的角度上考虑,这是一个很好的做法。
②系统的可维护性。向客户端提供的public接口是一种承诺,一个对外开发的接口一旦承诺,就很难撤回。作为软件提供商,我们不应当作出过多的承诺,特别是不需要的承诺。过多的承诺会给系统的维护造成不必要的负担。
如果这些接口仅仅是给公司内部的系统使用,那么将这些接口隔离开来,也可以降低维护的成本。因为如果一旦所提供的服务出现变化的话,我们知道哪些客户端会受到影响,哪些不会受到影响。这显然也是符合迪米特法则的。
五、古语解析
“看人下菜碟”的意思说,要看客人是谁,再提供不同档次的饭菜。从接口隔离原则的角度出发,根据客户端需要的不同,而为不同的客户端提供不同的服务是一种应当得到鼓励的做法。
本文通过总结《java与模式》而来。