随着IOC各种实现(比如Spring
/guice
)出现,特别是Spring的影响力的扩大化,面向接口编程范式被提出来,于是企业编程中便大量地使用IOC技术,典型的展现形式是一个接口对应一个(几乎全部是仅有一个
)实现,接口和具体的实现类的绑定通过IOC容器实现。相信这种现象很多人都看到过,并且现在依然在这么做,甚至没有停下来思考过合理性。我记得刚刚进入公司的时候,看到应用中有大量的spring配置文件,各种DAO和各种Manager都配置在其中,而且几乎每个接口基本都是只有一个实现类。我尝试怀疑过这样做的合理性,但是被“资深人士”解说,“这是面向接口编程范式,只依赖接口,可以隐藏实现细节,隔离实现类使用的依赖,适应新的变化。
”类似的话,然后我崇拜地点了点头,表示恍然大悟,其实我并没理解
。
现在回过头来看看,这些话是不是真的名副其实呢?“只依赖接口,可以隐藏实现细节”这句话,我表示赞同,但是这不是使用接口的有力证据。事实上,类(class)本身也是对功能的抽象,也隐藏了实现细节。“隔离实现类使用的依赖”这句,我表示不完全苟同。举例说明,假如A是接口,AImpl是A接口的实现类,B是A的客户端,如果B直接依赖AImpl的话,会把AImpl依赖间接依赖进来,但是是编译时依赖。如果B依赖A接口,那么最终在运行时AImpl最终会被注入到B中,顺带着AImpl的依赖会带进来,不过这个是运行时依赖。通过这个,不难看出,只是把依赖搞成了编译时和运行时,当然运行时的依赖有时候会好点,比如通过OSGi
可以暴露出很少的类,从而减少依赖冲突。再来看“适应新的变化”这句,前边也说到,几乎每个接口都只有一个实现类,那么貌似适应新的变化并不具备说服力。当然,我并不是完全否定面向接口技术,也不是对IOC嗤之以鼻。我只是想表达一下“一个接口一个实现”的问题。
接下来,什么时候情况下才考虑使用面向接口技术呢?要搞清楚这个,首先谈下接口的意义。个人理解如下:接口是对功能的抽象,更是对功能变化
的抽象;接口是模块间
的一种契约。接口这两点特性决定了接口的使用方式,
对于独立的模块(甚至是独立的系统)之间的交互,使用接口是推荐的方式,甚至是必须的
,这样隔离了模块实现细节,对模块之间的独立开发重构以及测试都起到了关键作用。
对于模块内部那些经常变化(至少目前业务可见范围内)的功能单元,可以抽象成接口
,这样方便以后提供新的实现类来增加新的功能,这个不是必须的,但是是推荐的。
对于模块内部几乎不会发生变化的功能,就没有必要提供抽象成接口了
,因为很少变化,而且是在模块内部使用,所以以Class的形式抽象就完全可以了。
如上图,蓝色区域代表一个模块甚至是一个系统,黑色条带表示接口,黄色表示具体的功能类,绿色区域表示实现了接口的功能类,箭头表示依赖或者实现接口。这幅图基本描述了,接口的使用方式,模块之间使用接口依赖,模块内部多变功能使用接口抽象,模块内部很少变化的功能不使用接口
。
好吧,就这么多吧。第一次写技术博客,个人的理解和高度有限,难免会有误差,欢迎拍砖。
- 大小: 22.9 KB
分享到:
相关推荐
面向接口编程是软件设计中的一个重要概念,尤其是在Java和Android开发中。它是一种编程范式,强调程序应通过其公开的接口与其消费者进行交互,而不是直接依赖于其实现细节。这样的设计提高了代码的可扩展性、可维护...
### 实验项目C、面向抽象和面向接口编程 #### 一、实验目的 本实验旨在通过实际操作加深学生对面向对象编程中两个重要概念——**面向抽象编程**和**面向接口编程**的理解与掌握。具体目标包括: 1. **掌握继承的...
以上是Java面向对象编程的一些基本概念,通过解决孙卫琴女士教程中的课后思考题,学习者可以更好地理解和应用这些知识。解答集"answer"应详细阐述了这些问题的解题思路和实现方法,对于深入学习和复习Java面向对象...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在OOP中,对象是类的实例,类则是对象的模板或蓝图。这个压缩包文件《面向对象的...
这些知识点是《Java面向对象编程》一书的核心内容,通过阅读书中的思考题及答案,可以帮助读者巩固理论知识,提升实际编程能力。对于初学者来说,理解并熟练运用这些概念是掌握Java编程的关键步骤。
根据提供的文件信息,我们可以从中提取以下知识点: ...为了更深入地学习Java面向对象编程,建议读者阅读孙卫琴老师的书籍,结合实例和练习,不断实践和思考,从而真正掌握面向对象的开发思想和方法。
2. **封装**:封装是面向对象编程的基础原则之一,通过封装,我们可以隐藏对象的内部实现细节,只暴露必要的接口给外部使用。在Java中,我们使用访问修饰符(如private, public, protected)来控制类的成员对外的...
面对面向对象编程,我们需要思考的问题包括: 1. 如何合理地设计类和对象,以达到最佳的数据抽象和封装? 2. 如何选择合适的继承结构,以支持代码的扩展和复用? 3. 在什么情况下应该使用多态,以及如何利用多态...
这意味着我们应该针对接口编程,而不是实现编程。 - **实践意义**:这有助于降低模块之间的耦合度,提高系统的灵活性和可维护性。 6. **迪米特法则**:一个对象应该尽可能少地与其他对象发生相互作用。简单来说...
面向对象编程不仅仅是一种编程技巧,更是一种思考问题的方式。它通过将复杂问题抽象成对象,然后在对象之间定义清晰的接口和责任来解决问题。这种方法有助于代码的模块化、复用以及易于测试,从而提高开发效率和软件...
面向对象编程是Java编程的核心,它允许我们通过模拟真实世界中的对象和它们之间的关系来编写代码。...通过面向接口编程,我们可以专注于对象的能力,而不是具体的实现细节,从而提高代码的可维护性和复用性。
2. **代码复用**:通过继承和封装,面向对象编程促进了代码的重用,降低了开发成本,提高了生产效率。 3. **易于维护**:由于对象的独立性和封装性,系统的修改和升级更加容易,因为更改通常仅限于受影响的模块。 4....
【C#面向对象深入思考与综合运用】笔记主要围绕C#中的面向对象编程特性展开,通过设计一个体育彩票选号器的实例,展示了OOP在实际应用中的运用。下面将详细阐述涉及的知识点: 1. **窗体拖动**:窗体的拖动功能是...
而外接口则面向用户或外部系统,规定了如何与软件进行交互。 指令接口是硬件和软件之间的桥梁,它定义了硬件如何响应软件发出的指令。例如,在计算机系统中,CPU通过指令集接口与内存和输入/输出设备进行通信。了解...
面向对象编程(C++)是计算机科学中一种重要的编程范式,它基于“对象”的概念,将数据和处理数据的方法封装在一起,以实现更高效、更模块化的代码编写。C++是一种支持面向对象编程的多范式语言,它在继承自C语言的...
封装是面向对象编程的主要特征之一,它将对象的状态(即属性)和行为(即方法)结合成一个独立的整体,并将对象的数据和代码操作相隐藏,只向外界提供必要的接口。继承是面向对象编程的一个重要特性,它允许我们创建...