本文转载至:https://www.cnblogs.com/lovelycode/articles/6887958.html

我从接触java编程开始,书上、网上看到的都是面向接口编程,虽然一脸懵逼,但也没有多想,这个和每个人的学习习惯有关系吧,我一直都是奉行着what how why的学习原则,管他是什么妥妥的就是干(copy),别人这么干我也这么干。公司里最常见的Spring 业务逻辑层应该是这样的:

接口

public interface UserService {User findByUsername(String username);
}

实现类

@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao dao;@Overridepublic User findByUsername(String username) {return dao.findByUsername(username);}
}

在很长一段时间里不明白为什么要这样做,也没有去深入研究,以至于再后来开发的时候直接去掉了实现类UserServiceImpl变成了这样

@Service
@Transactional
public class UserService {@Autowiredprivate UserDao dao;public User findByUsername(String username) {return dao.findByUsername(username);}
}

妥妥的没毛病,程序少了接口,代码都可以少敲点(幸福来的好突然)。在很长一段时间里整个公司都是这么干的,直到遇到了大一点项目(分布式部署,系统之间产生了交互),然后对接口有了新的认识,以下是自己对接口的一些理解。

很多其他行业在计算机面世之前就已经发展很久了,所以接口并不是计算机程序特有的,可以说接口无处不在。生活中很熟悉的插座

卖插座的厂商不一定会生产插头,但是普通家电的三线插头都是按照这样的规范设计的,为了保证可以完美插入像这样

当然香港买的肾7什么的,他的充电器插头就不好插了,好尴尬WTF

像这样的插头就需要转接头了(设计模式中的适配器模式),厂商是按照不一样的标准生成的,大陆有大陆的标准,香港有香港的标准。

接口是规范

插座是为了规范插头生产厂商,USB接口是为了规范USB生产厂商,程序的接口是为了规范什么呢?为了规范广大不同经验不用阅历的程序猿,为了实现类与类之间的松耦合。调用者只要按照接口规范传入入参接口就会返回期望的出参(结果),具体是怎么实现的(内部结构,业务逻辑)调用者无需关心(像不像领导,只要结果不要过程,领导规定并调用接口,我们去实现)。

public interface SortService<T extends Comparable> {void sort(T[] array);
}

SortService的sort方法是给数组正序排序,在数组长度小的时候可能用简单排序,冒泡排序就行了,大一点用归并排序,在大一点用快速排序。对于调用者来说只关注排序的结果,不关注过程。

面向接口编程在协同开发的时候也是非常有作用的,假设两个开发人员A和B一起开发一个商品购买的功能,商品购买的流程假设分为:库存查询和付款,

A负责开发查询库存,B负责开发付款;

A在查询库存返回还有库存后需要调用付款流程;

B提供付款接口给A,A调用接口获得付款结果;

B是怎么实现付款的,A不需要知道,哪天现有的付款逻辑不合适了,B重新开发了,也不会影响整个流程。

付款接口就是规范了B必须要按照接口的方法名,方法入参和出参类型来写实现类。

接口是协议

http协议大家应该很熟悉(客户端请求指定的地址可以当做是服务端提供的一个接口),请求报文格式如下:

服务器按照http约定的报文格式解析报文,客户端按照http约定的报文格式提交报文获得响应数据,至于服务器是怎么产生这些数据的客户端不需要知道,客户端只需请求服务器提供的链接地址就能获取想要的数据,服务器和客户端之间就实现了请求-响应的通信。

最近开发的一个项目由多个子项目构成,项目与项目之间要相互调用对方的接口,项目里使用Hessian框架实现远程接口调用,项目只需将接口和Dto打成jar包给客户端,客户端就能像使用本地的Bean一样,实现调用了(Hessian真是简单粗暴)。将接口暴露给客户端,实现隐藏起来。

客户端和服务端按照约定的协议进行数据交互,服务端按照约定的协议提供接口。

接口是标识

标识实现类可以做什么,不可以做什么,例如:java.io.Serializable接口,此接口没有任何方法和字段,只是标识实现类是否可以序列化和反序列化。像这样的空接口在实际开发中还有很多其他作用,比如标识实现类是否需要统计调用方法的执行时间(druid中的统计)、标识实现类是否需要记录调用日志等等。

当然简单的项目还是可以省去接口的,没有必要搞的太复杂,少敲代码可以实现相同的功能对于程序员来说就是幸福。但这种幸福往往是短暂的(重构和拓展就是噩梦)。

面向接口编程,接口是什么,有什么作用?相关推荐

  1. 【转】工厂模式面向接口编程

    为了实现更好的灵活性     应改面向接口编程.因此,应该面向接口提供工场.         比如,Cat,   Dog,   Mouse,都是4条腿会跑的动物.     因此,我们建立一个接口叫做F ...

  2. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程

    先用一个案例来给大家说明一下面向接口编程. 案例:有一个电脑类(Computer),电脑除了有基本的开机关机功能外,还有连接任何外接设备的功能,比如能电脑能连接外置键盘(Keyboard),鼠标(Mo ...

  3. Java面向接口编程,低耦合高内聚的设计哲学

    接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...

  4. java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程

    多态 多态指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同. 多态的要点: 1. 多态是方法的多态,不是属性的多态(多态与属性无关). 2. 多态的存在 ...

  5. Java 面向抽象编程和面向接口编程

    以下内容来自<Java 2实用教程>,主编:耿祥义.张跃平 鉴于面向抽象编程和面向接口编程思维培养的重要性,写此博客巩固. 面向抽象编程: 在设计程序时,经常会使用到abstract类,其 ...

  6. 为什么有人说面向对象编程就是面向接口编程?

    "面向对象编程就是面向接口编程" 这句话相信, 很多人都在网上见过, 装b利器. 我一开始也是这么想的, 那些装b者丢下这一句, 就没下文了. 首先, 我认为这句话是1个假命题. ...

  7. python面向接口编程_Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

  8. C语言面向对象编程(四):面向接口编程

    Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性. 在面试 Java 程序员时我经常问的一个问题是:接口和抽象类有 ...

  9. python 接口编程_Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

  10. 软件设计模式—面向接口编程

    原文作者:laoer2009 原文地址:设计模式之面向接口编程 01第一次需求 玩家有很多属性,例如:身高,性别 blalalala ,玩家可以攻击其他玩家.产品狗YY妹子写程序也是很利索,一天就把程 ...

最新文章

  1. 专用计算机教室设备,计算机教室专用规章制度
  2. c++ 13.二维数组
  3. MySQL 高级 - 存储过程 - 概述
  4. mysql数据库基本操作总结与归纳
  5. python实现api接口的脚本_Zabbix批量添加主机,Python调用api接口方式【脚本定制】...
  6. win7查看电脑ip地址的方法
  7. python工作环境创建_VirtualEnv 和Pip 构建Python的虚拟工作环境
  8. nsdictionary获取值_获得nsdictionary值
  9. 用Python网络爬虫来抓取网易云音乐歌词
  10. aria2最新tracker服务器,【无灯+Hiboy】padavan下自动更新aria2的BT tracker 服务器列表...
  11. 简易数字电路交通灯设计
  12. 文件服务器实现网络打印,图文详解 服务器共享打印设置
  13. runtime error python 3.5_Python 3.5 RuntimeError: can't start new thread
  14. 在服务器上下载安装anaconda
  15. 安装office时总得到“安装程序包的语言不受系统支持”的提示解决方法
  16. 计算机快捷键ctrl记忆,PS篇:有效记忆快捷键
  17. 计算机课英语谐音,各科老师“谐音梗”大集合,英语课现“脏话”,数学化身段子手...
  18. postgrepsql 安装失败
  19. YBT 6 数学基础
  20. FME的ESRI Geodatabase (MDB)格式介绍(一)

热门文章

  1. pdf怎么合并在一起?软件操作更高效
  2. Photoshop界面字体太小解决方案
  3. Office2007 PPT 宏修改文字颜色
  4. Mysql常用命令2
  5. uni-app使用教程
  6. dim和redim什么区别
  7. 少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(选择题)2022年9月
  8. 我的暑期实习找工作经历
  9. jsoncpp中json字符串的格式化及非格式化转换
  10. 链表中倒数第k个结点——《剑指offer》