一. 引言
Spring核心的IOC的实体用了面向接口编程思想,所以有必要了解下。简单来说的话,Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
接口的定义的概念:泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。关注点:抽象化,交互。(实体提供给外部的功能抽象化成一个接口(java概念),使得内部修改不影响外部与其的交互。(关注点由具体实现转移到接口交互))
二. 正文
(1)先看个例子
汽车和轮胎,假设有一辆汽车Car,Bridgestone轮胎,Michelin轮胎
Bridgestone转动:
public class Bridgestone{ public void roll() { System.out.print("Bridgestone is rolling."); } }
Michelin转动:
class Michelin { public void roll() { System.out.print("Michelin is rolling"); } }
汽车转动:
public class Car { public void roll(Bridgestone Bridgestone ) { Bridgestone.roll(); } }
(扩展性)但是如果汽车使用了Michelin轮胎,那么汽车的代码无法实现,需要修改,那么就变成如下:
public class Car { public void roll(Michelin michelin ) { michelin.roll(); } }
可是如果还有A,B,C等牌子的轮胎(类比喻:业务需求变化)呢,那要改无数次。很明显这样子的设计类之间的代码耦合度太紧,难以复用(Car的代码无法在各中轮胎下复用,都需要修改),编写单元测试困难(?:必须保证Car的roll方法被调用时候,Bridgestone的roll方法被要被调用。单元测试这块暂时不了解。)
单元测试概念:是指对软件中的最小可测试单元进行检查和验证。如果这个模块对其他模块有强烈的耦合的话,会造成单元测试困难。1. 单元测试代码需要更多的“桩”,因为单独出来的模块将无法正确编译执行,测试人员必须编写“桩”代码来让模块运行起来。2. 测试变的更加复杂,全面覆盖更加困难。有着复杂依赖的模块,其内部的状态更多,无法通过单元测试覆盖全面,降低了测试质量。
如果将这两种轮胎的共同特性提取出来,汽车转动轮胎时,无须知道轮胎的特定类型(品牌,对应的子类),只要轮胎有客户所期望的接口(roll)就行了,那样Car的代码扩展性好,可以接受任意实现Trie接口的轮胎,单元测试简单(注入实现类),代码耦合度松耦合相对之前的。
interface Tire { public void roll(); } class Bridgestone implements Tire { public void roll() { System.out.print("Bridgestone is rolling."); } } class Michelin implements Tire { public void roll() { System.out.print("Michelin is rolling"); } }
public class Car { public void roll(Tire tire) {tire.roll(); } }
以上就是面向接口编程的一个例子。
面向接口编程:面向接口意味着面向抽象,将各个实体之间的耦合程度由组件之间的耦合提升到接口层次,由接口做为粘合剂去维护关系,让一个实体由依赖另一个实体,转变成依赖一个接口,将被依赖实体的变化隔绝于接口之外。(在面向对象的系统中所有的类或者模块之间的交互是由接口完成的。)
(1)接口就是标准规范,一种规范约束,有了标准去遵守就容易扩展!我们只需要面向标准编程,而不用针对具体的实现类!面向接口编程好处:(1)抽象;(2)高内聚,低耦合,降低开发成本/维护成本(Car的开发者和轮胎的开发者可以并行开发,独立测试;替换轮胎,不需要修改Car的代码)。
(2)协调者(接口),调用者,实现者,接口本质上就是协调者来维护实现者和调用者之间的关系。实现者和调用者都必须遵循接口的规则(标准)。
例子:JDBC,各种数据库都按照JDBC的标准规范去开发数据库驱动程序,程序员都按照JDBC的标准去使用访问数据库。好处:驱动程序编写者不用去学接口文档来向程序员解释驱动程序的用法,程序员不关心具体的数据库。
(3)高内聚,低耦合概念
高内聚低耦合是软件设计的一个基本原则,说的是在程序的各个模块中,尽量让每个模块独立,相关的处理尽量在单个模块中完成,就是俗话说的:该干嘛干嘛去!优点:能提降低各模块的之间的联系,减少“牵一发而动全身”的几率,提高开发效率,降低升级维护成本,也便于进行单元测试,提高软件质量。
耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
高内聚关键字:最充分的利用模块中每一个元素的功能,达到功能实现最大化,内聚性越强越好,用最小的资源干最大的事情!
低耦合关键字:项目中的各个模块之间的关联要尽可能的小,耦合性(相互间的联系)越低越好,减小“牵一发而动全身”的可能性!
高耦合例子:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。
参考资料:
CSDN:https://blog.csdn.net/u013400743/article/details/51252003
https://blog.csdn.net/qq376430645/article/details/9927225
百度知道:https://baike.baidu.com/item/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1917084?fr=aladdin
https://zhidao.baidu.com/question/271744863.html
书籍:Spring实战第4版
原文地址:https://www.cnblogs.com/knsbyoo/p/9079374.html