Spring学习(2):面向接口编程思想
一. 引言
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):面向接口编程思想的更多相关文章
- spring是怎样面向接口编程的?
1.只要分层,就涉及到接口来连接.各层之间只通过接口来向外暴露功能. 2.spring中service层调用dao层时候,service层声明接口变量,具体接口实现可以ioc注入
- C#面向接口编程详解(1)——思想基础
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...
- Spring学习指南-第二章-Spring框架基础(完)
第二章 Spring框架基础 面向接口编程的设计方法 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...
- Spring学习之优缺点
Spring 1.Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFrame ...
- Spring学习笔记四:SpringAOP的使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776247.html 一:AOP基础概念 (1)通知(增强)Advice 通知,其实就是我们从众多类中提取出 ...
- Spring学习笔记一:基础概念
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html 一:Spring是什么 Spring的主要作用是作为对象的容器. 传统编程中,我们 ...
- 设计与实现分离——面向接口编程(OO博客第三弹)
如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度 ...
- Spring学习笔记(四)—— Spring中的AOP
一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- Spring 学习十五 AOP
http://www.hongyanliren.com/2014m12/22797.html 1: 通知(advice): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包 ...
随机推荐
- 日志采集框架Flume
前言 在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出.任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中 ...
- EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解
EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...
- android实现静默安装demo
1.须要RootTools.jar 2.运行脚本 public class InstallerActivity extends Activity { /** Called when the a ...
- 用JavaScript编写简单斗地主效果Es6
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- first-child伪类选择器
原文链接地址:https://www.cnblogs.com/wangmeijian/p/4562304.html :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w ...
- TestNG+Maven+IDEA 自动化测试(二) TestNG.xml
示例代码: https://github.com/ryan255/TestNG-Demo 项目代码结构参考上一章 TestNG+Maven+IDEA 自动化测试(一) 环境搭建 maven插件引入 & ...
- JDBC—执行sql语句的通用方法
/* * 执行 sql的方法集 * delete,insert into ,update */ public static void update(String sql){ Connection co ...
- ABAP术语-Update Key
Update Key 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/20/1114171.html Unique character str ...
- linux 学习第十一天
一.配置服务说明 1.1.linux系统中的一切都是文件 1.2.配置一个服务就是在修改去配置文件 1.3.要想让新的配置文件立即生效,需要重启对应的服务 二.配置网卡 2.1.编辑配置文件 vim ...
- MyEclipse部署项目时点finish点不动finish按钮灰色的
在MyEclipse中项目的propertes中输入tomcat搜索,jdk选择你本机安装的jdk