面向接口编程,接口是什么,有什么作用?

本文转载至: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 {
    @Autowired
    private UserDao dao;
@Override
public User findByUsername(String username) { return dao.findByUsername(username); } }
复制代码

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

复制代码
@Service
@Transactional
public class UserService {
    @Autowired
    private 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中的统计)、标识实现类是否需要记录调用日志等等。

 

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

猜你喜欢

转载自blog.csdn.net/qq_40400960/article/details/79831203