一. 引言

  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版

Spring学习(2):面向接口编程思想的更多相关文章

  1. spring是怎样面向接口编程的?

    1.只要分层,就涉及到接口来连接.各层之间只通过接口来向外暴露功能. 2.spring中service层调用dao层时候,service层声明接口变量,具体接口实现可以ioc注入

  2. C#面向接口编程详解(1)——思想基础

    我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...

  3. Spring学习指南-第二章-Spring框架基础(完)

    第二章 Spring框架基础 面向接口编程的设计方法 ​ 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...

  4. Spring学习之优缺点

    Spring 1.Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFrame ...

  5. Spring学习笔记四:SpringAOP的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776247.html  一:AOP基础概念 (1)通知(增强)Advice 通知,其实就是我们从众多类中提取出 ...

  6. Spring学习笔记一:基础概念

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html    一:Spring是什么 Spring的主要作用是作为对象的容器. 传统编程中,我们 ...

  7. 设计与实现分离——面向接口编程(OO博客第三弹)

    如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度 ...

  8. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  9. Spring 学习十五 AOP

    http://www.hongyanliren.com/2014m12/22797.html 1: 通知(advice): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包 ...

随机推荐

  1. centos6.4 安装code::blocks

    今天下午闲着没事尝试在自己的PC中的CentOS上装一个Code::Blocks,因为是Linux菜鸟折腾了一下午才基本算搞定但依然有疑惑: 在网上各种谷哥度娘最后才发现还是官方的文档最靠谱:看这里. ...

  2. web前端开发从0到1—html结构与常用标签

    一:html文档标签结构 <html></html><!--文档片头信息,表示文档内容是用什么标签写的.--> <head></head>& ...

  3. TestNG+Maven+IDEA 自动化测试(二) TestNG.xml

    示例代码: https://github.com/ryan255/TestNG-Demo 项目代码结构参考上一章 TestNG+Maven+IDEA 自动化测试(一) 环境搭建 maven插件引入 & ...

  4. 【Linux资源管理】iotop命令监控磁盘使用情况

    一.iotop工具介绍 I/O可谓是数据库\服务器的最大瓶颈问题了,在使用top.nmon.zabbix.sar等工具监控I/O时,要么没有I/O监控(如top.zabbix),要么仅仅监控到磁盘层面 ...

  5. macOS:按钮类型

    for (int i = 0; i < 10; i++) { for (int j = 1; j < 16; j++) { NSButton *btn = [[NSButton alloc ...

  6. Web | JavaScript的引用数据类型强制转换类型

    我在这里主要的想提下的是JavaScript中的引用类型进行强制转换类型.因为对于基本数据类型的变换大多都是雷同的,很容易熟知,但是引用数据类型有一点小插曲. JavaScript的引用类型主要为对象 ...

  7. 傻瓜式搭建php+nginx+mysql服务器环境

    1.安装nginx 1.安装yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0. ...

  8. mysql-8.0.15允许外网访问

    1.进MySQL之后, 2.输入以下语句,进入mysql库: use mysql3.更新域属性,'%'表示允许外部访问: update user set host='%' where user ='r ...

  9. Linux下Tomcat性能优化--文件句柄数增大

    今天在对项目进行性能压力测试时,设置并发量为1000,发现Tomcat控制报错: java.IOException:打开的文件过多 经搜索,发现是由于Linux默认设置的句柄数为1024,当并发量过大 ...

  10. vs code 写C#心得

    !!!官方指南请访问: https://docs.microsoft.com/zh-cn/dotnet/core/index code runner 插件 ---------------------- ...