接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则,克服了类单一继承的缺点。用于在
系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类实现,
面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
简介
基于接口编程(Interface-based programming)也称基于接口的架构(interface-based architecture),它是一种在没有模块系统的
面向对象程序设计语言中的
组件层面实现模块化编程的
架构模式。匹配此例的一个语言是
Java,截至2015年,它没有组件级别的模块系统。Java有一个包(package)系统,但Java软件组件通常由多个Java包组成——并且在任何情况下,接口编程可以提供优于仅使用Java包的优势,即使组件仅由单个Java包组成。
基于接口的编程将
应用程序定义为组件的集合,其中组件间的
应用程序接口(API)调用可能只通过
抽象化接口完成,而没有具体的
类。类的实例化一般通过使用如
工厂模式等技术的其他接口完成。
这种方式被认为增加了应用程序的模块性并因而增加了
可维护性。但是,有必要谨慎考虑——仅将应用程序分解成通过接口通信的任意组件本身不能保证低
耦合性或高
内聚性,这两项通常被认为是可维护性的另外两项关键属性。
当第三方(或同一个组织内的另一个团队)为已创建的系统开发了额外的组件或插件时,可以使用基于接口体系结构。Eclipse IDE的代码库就是基于接口编程的一个例子。Eclipse插件插件供应商只需开发满足父应用程序供应商Eclipse基金会指定接口的组件。在Eclipse中,哪怕“Java开发工具”等原始组件本身也是一个插件。这有点像
移动电话制造商制定的移动充电器接口(引脚布局、预期
直流电电压等)和,制造商和第三方都制造匹配这种标准接口规范的手机充电器。
接口的本质
接口,在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承
1)接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。
体现了自然界“如果你是……则必须能……”的理念。
例如,在自然界中,人都能吃饭,即“如果你是人,则必须能吃饭”。那么模拟到计算机程序中,就应该有一个IPerson(习惯上,接口名由“I”开头)接口,并有一个方法叫Eat(),然后规定,每一个表示“人”的类,必须实现IPerson接口,这就模拟了自然界“如果你是人,则必须能吃饭”这条规则。
面向对象思想的核心之一,就是模拟真实世界,把真实世界中的事物抽象成类,整个程序靠各个类的实例互相通信、互相协作完成系统功能,这非常符合真实世界的运行状况,也是面向对象思想的精髓。
2)接口是在一定粒度视图上同类事物的抽象表示。
因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。
接口得以存在的意义。面向对象思想和核心之一叫做多态性,就是在某个粒度视图层面上对同类事物不加区别的对待而统一处理。
面向接口编程综述
在
系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
这样做的好处是显而易见的,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。
面向对象语言中的“接口”是指具体的一种代码结构,例如C#中用interface关键字定义的接口。而“
面向接口编程”中的“接口”可以说是一种从软件架构的角度、从一个更抽象的层面上指那种用于隐藏具体底层类和实现多态性的结构部件。
面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除
多重继承外(C#,Java中),
抽象类似乎完全能取代接口。但是,
抽象类和接口的区别在于使用动机。使用
抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。