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): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包 ...
随机推荐
- 阿里云阿里免费ssl wap网站在手机微信、手机浏览器无法访问
图片可以访问,样式无法显示 https://css.cnbuses.com/css/wap/gonggong.css 1,怀疑是开了代理访问. 关闭后还是访问空白. 2.在手机浏览器打开,提示该网站的 ...
- 图形剖析,当给 ul 设置padding=0, margin=0后 li前面的小黑点消失的现象原理!
- PLSQL Developer 12 注册码
PLSQL Developer 12 注册码product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password ...
- [iOS]app的生命周期
对于iOS应用程序,关键的是要知道你的应用程序是否正在前台或后台运行.由于系统资源在iOS设备上较为有限,一个应用程序必须在后台与前台有不同的行为.操作系统也会限制你的应用程序在后台的运行,以提高电池 ...
- Linux系统Java环境配置
1.卸载Linux系统自带的JDK java -version rpm -qa | grep -i java 我们要删除掉自带的JDK环境 rpm -e --nodeps java-1.6.0-ope ...
- MySQL----MySQL数据库入门----第二章 数据库和表的基本操作
2.1 数据库和数据库表的创建 ①数据库的创建(在数据库系统中划分一块存储数据的空间): create database 数据库名称 [charset 字符集]: ②数据库表的创建 use 数据库名 ...
- 02.centos7上搭建hadoop集群
接上一篇 https://www.cnblogs.com/yjm0330/p/10069224.html 一.准备工作:无密登陆 1.编辑/etc/hosts文件,分别增加 192.168.2.24 ...
- Selenium_python自动化跨浏览器执行测试(简单多线程案例)
发生背景: 跨浏览器测试是功能测试的一个分支,用以验证web应用在不同浏览器上的正常工作,通常情况下,我们都期望web类应用能够被我们的用户在任何浏览器上使用,例如有的人喜欢IE浏览器上使用,有的人喜 ...
- golang 切片小记
1 切片初始化 func printSlice(s []int) { fmt.Printf("len=%d cap=%d underlying array:%p, %v\n", l ...
- STM32串口一直进中断
调试过程中遇到了使用串口什么都没接却一直进中断,接串口线到电脑上测试又正常的问题. 网上有人说需要将USART的RX模式从输入浮空改成输入上拉,改后测试正常,问题解决. 分析可能是什么都不接时浮空模式 ...