`
wxyjuly
  • 浏览: 3677 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

接口漫谈

 
阅读更多

接口漫谈

一、为什么使用接口。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、如何使用接口。

1,接口的定义。

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

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

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

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

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

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

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

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

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

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

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

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


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

分享到:
评论

相关推荐

    移动通信天线漫谈

    移动通信系统是有线与无线的综合体,它是移动网络在其覆盖范围内,通过空中接口(无线)将移动台与基站联系起来,并进而与移动交换机相联系(有线)的一个综合的复合体。而在移动通信系统中,空间无线信号的发射和...

    射频技术漫谈

    (20)——RC系列射频接口芯片 (21)——RC系列射频芯片的天线设计 (22)——RC系列射频芯片的寄存器操作 (23)——ISO15693的载波、调制与编码 (24)——ISO15693的防冲突与传输协议 (25)——Felica简介 (26)——Felica的...

    VB6.0动态加载ActiveX控件漫谈

    VB6.0动态加载ActiveX控件漫谈 深圳 罗汉军 罗德昌 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程, 但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。 VB6.0...

    漫谈C++:良好的编程习惯与编程要点

    ① Header(头文件)中的防卫式声明 ② 把数据放在private声明下,提供接口访问数据 ③ 不会改变类属性(数据成员)的成员函数,全部加上const声明

    【LocustPlus序】漫谈服务端性能测试

    最近因为工作原因,我又拾起了老本行,开始做Web性能测试。之前虽然做过三四年的性能测试,但是在博客和开源项目方面都没有什么输出,一直是一个很大的遗憾。因此,近期打算围绕服务端性能测试的话题,将自己在这...

    FPGA研发之道(7)架构设计漫谈(二)稳定压倒一切

    FPGA的架构设计最首先可以确定就是外接接口,就像以前说的,稳定可靠的接口是成功的一半。接口的选择需要考虑几个问题。

    FPGA研发之道(8)架构设计漫谈(三)时钟和复位

    接口确定以后,FPGA内部如何规划?首先需要考虑就是时钟和复位。时钟:根据时钟的分类,可以分为逻辑时钟,接口时钟,存储器时钟等; 复位:根据复位的分类,FPGA内部复位可以分为硬复位,逻辑复位、软复位等;

    新版本SpringCloud2学习手册

    漫谈微服务架构 2 什么是微服务 2 微服务架构特征 3 微服务架构如何拆分 3 微服务架构与SOA架构区别 3 SpringCloud微服务框架 3 为什么选择SpringCloud 4 SpringCloud简介 4 服务治理SpringCloud Eureka 5 ...

    java多线程设计模式详解(PDF及源码)

    目录 漫谈UML UML 类图 类和层次结构的关系 接口与实现 聚合 访问控制 类间的关联性 顺序图 处理流程和对象间的协调 时序图 Introduction 1 Java语言的线程 Java语言的线程 何谓线程 明为追踪处理流程,实则追踪...

    淘宝放单源码Java-agan-boot:gan-boot

    漫谈SpringBoot与SpringCloud分布式服务架构 01 SpringBoot 入门 1.为什么越来越多的开发者选择使用SpringBoot?它解决了什么问题? 2.SpringBoot的入门例子 3.SpringBoot 常用配置 4.SpringBoot 自定义配置 5....

    2020首发大富双盘独家修复开奖与采集+WAP+WEB(完整版)

    服务器环境:Win2008R2(推荐)+ 宝塔或其它集成环境 + 一级域名1个 ... 服务器推荐配置:4G以上 4核处理器 带宽5M(否则可能无法运行) 注意:宝塔 搭建请自行修改伪静态否则无法打开 搭建教程:安装集成环境 + ...

    Java思维导图xmind文件+导出图片

    漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE...

Global site tag (gtag.js) - Google Analytics