上一章我们聊到,代码的本质是在处理数据。
程序员都有个通病,那就是懒。面向对象语言的三大特征,全部都是为了干一件事情:统一公共管理数据的处理流程,即简化代码。
而在这一过程中,出现了一个神奇的产物,就是接口。所有的设计模式,都在围绕接口作文章。甚至可以说,接口是面向对象语言的灵魂。
接口的作用:
一、定义规范
众所周知,接口的本质,是一类抽象方法的集合,是一个规范。也就是说,接口定义了一种特殊的数据格式,它的存在是抽象的。
由此诞生了一系列的设计模式,越好的代码,越在面对抽象编程。扩展维护更简单,程序的走向不再依赖具体实现,而是依赖一套接口定义而成的规范。就如同工厂的流水线,只定义了每个环节的“结果”,而具体的加工环节,由各个部分单独完成。
二、回调
JAVA中,如果想在一个方法的中途插入某些执行流程,比起封装方法加抽象类的组合,在恰当的时机通过接口调用实现,显然这样的方式处理起来更为优雅。
在后续的很多高级语言中,将方法也定义成了一个具体的类型,可以作为参数传入,弥补了必须定义接口的不足。
三、它是方法作为类型的由来
为什么方法可以被定义为一个具体的类型,接口在其中其实占了很大的比重。
首先谈到一个东西叫匿名内部类。通过直接new Runnable() 的形式,简化了必须定义接口的具体实现类的步骤。
然而,JAVA的1.8版本中,新增了一个重要的东西:lambda表达式,当接口中只有一个抽象方法时,它避开了匿名内部类的实现,以线程的创建为例:
//匿名内部类的方式实现
Thread a = new Thread(new Runnable() {
@Override
public void run() {
}
});
//lambda的方式实现
Thread b = new Thread( () -> {} );
//其中,
Runnable r = ()->{}
//所以,r就是一个带有参数(空参)、函数体(空实现)、返回值(void)的一个具体类,即方法