神奇的接口

136 阅读2分钟

上一章我们聊到,代码的本质是在处理数据。

程序员都有个通病,那就是懒。面向对象语言的三大特征,全部都是为了干一件事情:统一公共管理数据的处理流程,即简化代码

而在这一过程中,出现了一个神奇的产物,就是接口。所有的设计模式,都在围绕接口作文章。甚至可以说,接口是面向对象语言的灵魂。

接口的作用:

一、定义规范

众所周知,接口的本质,是一类抽象方法的集合,是一个规范。也就是说,接口定义了一种特殊的数据格式,它的存在是抽象的

由此诞生了一系列的设计模式,越好的代码,越在面对抽象编程。扩展维护更简单,程序的走向不再依赖具体实现,而是依赖一套接口定义而成的规范。就如同工厂的流水线,只定义了每个环节的“结果”,而具体的加工环节,由各个部分单独完成。

二、回调

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)的一个具体类,即方法