现在的位置: 首页 > 综合 > 正文

接口漫谈

2014年08月08日 ⁄ 综合 ⁄ 共 2273字 ⁄ 字号 评论关闭

接口漫谈

一、为什么使用接口。

1,接口可以解除耦合,隔离变化。

根据DIP(依赖倒转)原则,具体类应该依赖于抽象也就是接口。对象的持有者不应该直接持有对象,因为这样的话被持有对象的任何变化,都会影响持有者,对被持有对象的任何修改都有可能导致持有者的修改,至少也要导致持有者的重新编译和测试。随着系统的增长这种现象会越来越严重,最后导致系统难以修改或者说任何一个小修改都会是一项大工程。这就是高度的对象耦合带来的灾难。

然而接口可以很好的解除这种耦合,持有者对象只是持有对象的接口而不是具体对象,而被持有者就实现了这个接口。这样持有者和被持有者之间就没有了直接的依赖关系,他们都依赖于接口(抽象)。我们知道具体的类往往是易变的,而接口往往是比较稳定的--如果你的接口定义得当的话(如何定义合适的接口,在后面有所论述)。如此一来,被持有者的变化就接口给隔离了,不会传播到持有者对象了。
参见我的《接口与口罩》

2,接口简化客户编程,降低使用者的编程难度。

首先,接口相对于具体类,有简单的特点,它只定义了必要的行为和方法,没有任何的细节信息,所以它比具体类要简单的多。简单就带来减少了使用者需要了解的信息。

其次,接口相对于具体类,有明确性和唯一性的特点。具体类中可能有大量实现相似甚至相同功能的方法(例如使用了双向适配模式),这会让使用者无所是从。而使用定义良好的接口却不会出现这些问题。

所以说,接口表面看限制了对象间的通讯,实则简化了这种通讯。

3,接口规范了使用者和被使用者的行为。

对于使用者而言,它只会也只能使用接口定义好的方法,而对于被使用者也就是接口的实现类,则必须实现这些方法。这样两者就实现了一种契约关系。

这对于,多人协作时尤为重要。不同的使用者使用同一个具体类时,由于大家的理解不同,可能使用方式也不同,有些可能是违反这个具体类作者的意愿的。而实现同样的功能,也可能大家都用自己的一套习惯。这就造成代码风格的不统一,这对于修改和维护是非常不利的。

使用接口后,具体类的不同将隐藏在接口这个统一的规范下,代码的风格将更加趋于一致,使用者和被使用者不用互相关心,更易于修改和维护。

以上两点,总的来说是接口提供了对象之间互相访问的标准。通过这个标准既实现了通讯的目的又规范了彼此的行为。

4,接口可以提供多态性。

由于上面所讲的隔离性和规范性,就使使用者和被使用者之间没有了直接的关系,可以独立的变化而不互相影响。

对于,使用者而言,只要符合它所使用的接口,它就可以正确的使用。而不用关心被使用的到底是什么,以及怎么实现的接口。对于被使用者只要实现了预定义的接口,就可以被正确的使用。它不关心到底自己怎么被使用。也就是对于同一个使用者我们可以给他不同的被使用者来实现不同的行为,如此就实现了多态性。

5,接口是设计模式的基础。

设计模式是面向对象的精华,而接口的使用却是设计模式的基础。纵观“四人帮”的23个经典模式,绝大多数使用了接口。甚至有人认为“设计模式通篇都在讲面向接口编程”。可以说学习设计模式的过程就是学习接口使用的过程,反之亦然。

当然,接口的使用也许会增加一定的复杂性,但我认为相比于以上优点,这是微不足道的。现在大家都在倡导的面向接口编程(面向接口编程比我这里论述的范围要广的多。)更加说明接口的重要性已经被越来越多的人所认识。既然接口如此的有用,可怎么去用它呢?

二、如何使用接口。

1,接口的定义。

要使用接口,首先要定义接口。良好的接口定义是合理使用接口的基础。可怎样的接口才是良好定义的接口呢?应该具备高内聚,低耦合等特点。还要有一个易懂的名子。

接口的命名牵涉了一个接口定义的出发点问题。是从使用接口的客户出发定义接口,还是从接口的实现类出发去定义接口。习惯的作法是从实现类出发去定义接口,也就是先有实现后有接口。我认为从客户出发定义接口更为合理。我们来考虑引起接口变化的因素。接口只有在客户认为它不能满足要求时才会被改变,而不会因它的实现改变而改变。所以说接口和使用它的客户关系更紧密一些。所以说应该从客户出发去定义接口,并给接口命名。例如一个客户需要一个存储模块,应该定义一个IStoreSevice的接口表示它可以提供存储服务,而不是IDB接口。

根据ISP(接口分离)原则,接口应该以使用它的客户分离,不能让客户依赖它并不使用的接口。这也说明了要从客户的出发去定义接口。这样的接口才是高内聚低耦合的。

2,先定义接口还是先写具体类?

       我倾向于先定义接口。先从客户使用的角度出发去定义接口,然后再用具体类实现这些接口。这也是从客户出发定义接口的必然结果。当然,也有人认为这是过度设计,认为应该需要接口时再增加接口。这可能要根据实际情况来分析决定。

3,对象之间只能通过接口通信吗?

       也不是。如果单从解除耦合和隔离变化来看的话,下面几种情况不需要定义接口。

1,如果两个类之间关系比较紧密,互相之间的实现依赖性很强的话,定义接口是徒劳的。只会增加复杂性。

2,如果两个类总是同时变化的话,这两个类之间的接口也是多余的,因为它起的作用是多余的。

3,对于一个非常稳定的类,也没必要定义接口。既然它没有变化,我们又隔离什么呢?这种类大多是一些类库中的基础类和工具类。

其他几种情况就视实际情况而定啦。还有一些原则参见《接口与口罩》

我自知对面向对象的思想理解甚浅,但无知者无畏,希望这篇文章能起到抛砖引玉的作用。希望大家多讨论交流。

引用自:http://blog.csdn.net/hedylin/article/details/119636

抱歉!评论已关闭.