“你好,阿米戈!还是我。我想让换个角度向你介绍接口。你看,大多数情况下,类是一个特定对象的模型。通过比较,接口更像是对象的能力或角色,而不是对象本身。”

接口并不只是接口而已。它还是一种行为。 - 1

例如,汽车、自行车、摩托车和车轮就是类和对象最好的例子。但是它们的能力,例如“我可以移动”,“我可以载人”,以及“我可以停放”则可以理解为接口。请考虑以下示例:

Java 语言代码 说明
interface Moveable
{
void move(String newAddress);
}
相当于移动能力。
interface Driveable
{
void drive(Driver driver);
}
— 相当于移动能力。
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
— 相当于载货能力。
class Wheel implements Moveable
{
...
}
— 车轮 (Wheel) 类。有移动能力。
class Car implements Moveable, Drivable, Transport
{
...
}
— 汽车 (Car) 类。有移动能力,可以由人类驾驶并装载货物。
class Skateboard implements Moveable, Driveable
{
...
}
— 滑板 (Skatebaord) 类。有移动能力,可以由人类控制。

接口可以让程序员的生活轻松许多。程序经常有成千上万的对象,成百上千的类,和多个接口(角色)。角色数量不多,但它们的组合方式(类)可以有很多种。

重点就是你不需要写代码去定义与其他类的交互。你唯一要做的就是定义与角色(接口)的交互。

假如你是一个机器人制造师。你手下有很多机器人,每个机器人都掌握了多项技能。假如你急需要砌墙。你只要召集所有掌握 build(砌墙)技能的机器人,命令它们去砌墙。你不用去关心具体是哪个机器人去砌墙。即使它是个机器喷水壶,只要它会砌墙,就派它去。

下面就是它在代码里的工作原理:

Java 语言代码 说明
static interface WallBuilder
{
void buildWall();
}
— 能够“砌墙 (build a wall)”。理解“砌墙 (build a wall)”命令(有合适的方法)。
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
— 有此技能的机器人。

— 浇水壶不能砌墙(它不会实施 WallBuilder 接口)。

public static void main(String[] args)
{
 //add all robots to a list
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //build a wall if you can
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
— 我们如何下达砌墙命令?

“听上去很有趣。我从没想过接口是如此有趣的话题。”

“不止这样!如果再加上多态,效果会更令人震撼。”