接口漫谈
一、为什么使用接口。
1,接口可以解除耦合,隔离变化。
根据DIP(依赖倒转)原则,具体类应该依赖于抽象也就是接口。对象的持有者不应该直接持有对象,因为这样的话被持有对象的任何变化,都会影响持有者,对被持有对象的任何修改都有可能导致持有者的修改,至少也要导致持有者的重新编译和测试。随着系统的增长这种现象会越来越严重,最后导致系统难以修改或者说任何一个小修改都会是一项大工程。这就是高度的对象耦合带来的灾难。
然而接口可以很好的解除这种耦合,持有者对象只是持有对象的接口而不是具体对象,而被持有者就实现了这个接口。这样持有者和被持有者之间就没有了直接的依赖关系,他们都依赖于接口(抽象)。我们知道具体的类往往是易变的,而接口往往是比较稳定的--如果你的接口定义得当的话(如何定义合适的接口,在后面有所论述)。如此一来,被持有者的变化就接口给隔离了,不会传播到持有者对象了。
参见我的《接口与口罩》
2,接口简化客户编程,降低使用者的编程难度。
首先,接口相对于具体类,有简单的特点,它只定义了必要的行为和方法,没有任何的细节信息,所以它比具体类要简单的多。简单就带来减少了使用者需要了解的信息。
其次,接口相对于具体类,有明确性和唯一性的特点。具体类中可能有大量实现相似甚至相同功能的方法(例如使用了双向适配模式),这会让使用者无所是从。而使用定义良好的接口却不会出现这些问题。
所以说,接口表面看限制了对象间的通讯,实则简化了这种通讯。
3,接口规范了使用者和被使用者的行为。
对于使用者而言,它只会也只能使用接口定义好的方法,而对于被使用者也就是接口的实现类,则必须实现这些方法。这样两者就实现了一种契约关系。
这对于,多人协作时尤为重要。不同的使用者使用同一个具体类时,由于大家的理解不同,可能使用方式也不同,有些可能是违反这个具体类作者的意愿的。而实现同样的功能,也可能大家都用自己的一套习惯。这就造成代码风格的不统一,这对于修改和维护是非常不利的。
使用接口后,具体类的不同将隐藏在接口这个统一的规范下,代码的风格将更加趋于一致,使用者和被使用者不用互相关心,更易于修改和维护。
以上两点,总的来说是接口提供了对象之间互相访问的标准。通过这个标准既实现了通讯的目的又规范了彼此的行为。
4,接口可以提供多态性。
由于上面所讲的隔离性和规范性,就使使用者和被使用者之间没有了直接的关系,可以独立的变化而不互相影响。
对于,使用者而言,只要符合它所使用的接口,它就可以正确的使用。而不用关心被使用的到底是什么,以及怎么实现的接口。对于被使用者只要实现了预定义的接口,就可以被正确的使用。它不关心到底自己怎么被使用。也就是对于同一个使用者我们可以给他不同的被使用者来实现不同的行为,如此就实现了多态性。
5,接口是设计模式的基础。
设计模式是面向对象的精华,而接口的使用却是设计模式的基础。纵观“四人帮”的23个经典模式,绝大多数使用了接口。甚至有人认为“设计模式通篇都在讲面向接口编程”。可以说学习设计模式的过程就是学习接口使用的过程,反之亦然。
当然,接口的使用也许会增加一定的复杂性,但我认为相比于以上优点,这是微不足道的。现在大家都在倡导的面向接口编程(面向接口编程比我这里论述的范围要广的多。)更加说明接口的重要性已经被越来越多的人所认识。既然接口如此的有用,可怎么去用它呢?
二、如何使用接口。
1,接口的定义。
要使用接口,首先要定义接口。良好的接口定义是合理使用接口的基础。可怎样的接口才是良好定义的接口呢?应该具备高内聚,低耦合等特点。还要有一个易懂的名子。
接口的命名牵涉了一个接口定义的出发点问题。是从使用接口的客户出发定义接口,还是从接口的实现类出发去定义接口。习惯的作法是从实现类出发去定义接口,也就是先有实现后有接口。我认为从客户出发定义接口更为合理。我们来考虑引起接口变化的因素。接口只有在客户认为它不能满足要求时才会被改变,而不会因它的实现改变而改变。所以说接口和使用它的客户关系更紧密一些。所以说应该从客户出发去定义接口,并给接口命名。例如一个客户需要一个存储模块,应该定义一个IStoreSevice的接口表示它可以提供存储服务,而不是IDB接口。
根据ISP(接口分离)原则,接口应该以使用它的客户分离,不能让客户依赖它并不使用的接口。这也说明了要从客户的出发去定义接口。这样的接口才是高内聚低耦合的。
2,先定义接口还是先写具体类?
我倾向于先定义接口。先从客户使用的角度出发去定义接口,然后再用具体类实现这些接口。这也是从客户出发定义接口的必然结果。当然,也有人认为这是过度设计,认为应该需要接口时再增加接口。这可能要根据实际情况来分析决定。
3,对象之间只能通过接口通信吗?
也不是。如果单从解除耦合和隔离变化来看的话,下面几种情况不需要定义接口。
1,如果两个类之间关系比较紧密,互相之间的实现依赖性很强的话,定义接口是徒劳的。只会增加复杂性。
2,如果两个类总是同时变化的话,这两个类之间的接口也是多余的,因为它起的作用是多余的。
3,对于一个非常稳定的类,也没必要定义接口。既然它没有变化,我们又隔离什么呢?这种类大多是一些类库中的基础类和工具类。
其他几种情况就视实际情况而定啦。还有一些原则参见《接口与口罩》。
我自知对面向对象的思想理解甚浅,但无知者无畏,希望这篇文章能起到抛砖引玉的作用。希望大家多讨论交流。
引用自:http://blog.csdn.net/hedylin/article/details/119636
分享到:
相关推荐
《漫谈设计模式》这本书深入浅出地介绍了多种设计模式,通过代码实例帮助读者理解和应用这些模式。在这个压缩包“ramblingonpatterns-1.0”中,你将找到书中的代码示例,它们覆盖了各个章节的关键知识点。 1. **...
《漫谈兼容内核》是毛德操先生的一本深入探讨操作系统内核兼容性问题的专业著作。这本书主要针对计算机科学中的核心主题——操作系统内核,尤其是如何实现不同系统间的兼容性,提供了丰富的理论知识和实践经验。 ...
《Windows之漫谈兼容内核》是一份深入探讨Windows操作系统内核兼容性的资源,它旨在帮助用户和开发者更好地理解Windows系统的核心运作机制,特别是在处理不同版本间的兼容性问题上。本文将围绕Windows内核的基本概念...
本资源“NET 4.0面向对象编程漫谈 代码”由金旭亮编著,旨在深入探讨.NET 4.0中的面向对象编程概念,并通过实例代码来帮助读者理解和应用这些概念。 面向对象编程是一种编程范式,它基于“对象”的概念,将数据和...
《漫谈兼容内核》是毛德操先生对操作系统内核兼容性问题深入探讨的一部作品,主要聚焦在Windows系统中的兼容内核技术。在这个领域,我们常常会遇到各种软硬件兼容性挑战,如何使内核能够适应不同环境、支持各种设备...
"FPGA研发之道(7)架构设计漫谈(二)稳定压倒一切"这一主题,强调了在设计过程中必须以稳定性为优先考虑因素,避免因忽视细节而导致的潜在问题。 在架构设计初期,首先要确定的是外接接口。接口的选择应基于几个关键...
总的来说,“漫谈兼容内核”是一个深度探讨操作系统底层机制和跨平台兼容性的主题,涵盖了从进程调度到系统调用接口的广泛知识。理解这些概念和技术对于操作系统开发者、系统管理员以及对计算机系统有深入兴趣的人员...
封装是指将对象的实现细节隐藏起来,只暴露对外接口。这有助于减少程序各部分之间的依赖,使得代码更加易于维护。 抽象指的是隐藏复杂的现实情况,只保留所需关注的特定功能。在编程中,抽象通常通过接口或抽象类来...
Java 反射机制安全漫谈 Java 反射机制是 Java 语言中的一种强大功能,允许程序在运行时访问和修改类的信息。然而,这种功能也引入了安全隐患。本文将讨论 Java 反射机制的安全问题,重点介绍反射机制的基本概念、...
3. **内核兼容性原理**:作者可能详细讨论了如何实现内核对不同硬件、软件的兼容性,包括指令集兼容、文件系统兼容、设备驱动程序接口等。 4. **跨平台技术**:书中可能会涉及如何通过虚拟化技术、二进制翻译和源...
最后,“ReactOS怎样实现系统调用”章节介绍了开源项目ReactOS如何模仿Windows NT系统调用接口,这对于那些希望理解操作系统核心功能和实现原理的人来说,是一个难得的学习资源。 综上所述,《漫谈兼容内核》通过一...
ISO7816标准涉及集成电路卡,包含卡的物理特性、触点尺寸与位置、电信号和传输协议、与外界交互的接口组织、安全和命令等多个部分。 非接触式IC卡常用的载波频率包括125KHz、134.2KHz、13.56MHz、2.45GHz等。载波...
- **特质(Trait)**: 在Scala语言中,特质是一种组合单个类可以拥有的多个特性的接口。在这里,`Speaker`特质包含`name`和`aliases`属性,而`Organization`特质包含`bu`(业务单元)和`group`(所属集团)属性。 - **...
8. **网络堆栈**:分析Windows网络子系统,包括TCP/IP协议栈、套接字接口和网络数据包的处理流程。 9. **安全与权限**:讨论Windows的安全模型,如访问控制列表(ACL)、安全标识符(SID)和权限管理。 10. **调试...
《漫谈设计模式》这本书以其独特的视角深入浅出地探讨了这一主题,尤其针对Java语言进行了详尽的阐述。在这个压缩包中,包含的文件“漫谈设计模式”可能是该书的电子版或者相关的学习资料。 设计模式的核心在于提高...
### 漫谈Wine之一:Wine的系统结构 #### 一、Wine简介及研究背景 **Wine**(Wine Is Not an Emulator)是一个兼容层,旨在允许在类Unix系统(如Linux)上运行Microsoft Windows应用程序。本文档主要探讨Wine的核心...
在.NET 4.0面向对象编程漫谈基础篇中,金旭亮详细介绍了.NET框架下的面向对象编程的基础知识和技巧。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据...
标题《漫谈:人工智能的“能”与“智”》和描述中的内容指出,文档主要探讨了人工智能(AI)技术在现代生活中的应用、能力和智慧,并对智能技术的伦理和社会影响进行了深入讨论。文章通过多种实例来阐释人工智能的...
总而言之,《.NET 4.0面向对象编程漫谈 应用篇》这本书会深入讲解这些核心概念,并结合.NET 4.0的特性和实践案例,帮助读者掌握面向对象编程在实际项目中的应用。通过学习,开发者不仅可以提升编程技巧,还能更好地...
Java安全漫谈 - 反射篇(3)深入讲解了如何在Java中通过反射机制处理可变长参数和访问私有方法。反射是Java中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法,极大地增强了代码的灵活性。然而,这...