“你好,阿米戈!又是我。我想給你關於接口的另一種觀點。你看,大多數時候類是特定對象的模型。相比之下,接口更像是對象的能力或角色,而不是對象本身。”

例如,汽車、自行車、摩托車和車輪等事物最好表示為類和對象。但是他們的能力,比如“我可以移動”、“我可以載人”和“我可以停車”,最好用界面來表示。看看這個例子:

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
{
...
}
一個“汽車”類。具有移動、由人駕駛和運載貨物的能力。
class Skateboard implements Moveable, Driveable
{
...
}
一個“滑板”類。具有移動和被人控制的能力。

接口極大地簡化了程序員的生活。程序通常有數千個對象、數百個類和幾十個接口(角色)。角色很少,但可以通過多種方式(類)進行組合。

重點是您不必編寫定義與其他每個類交互的代碼。您所要做的就是與角色(接口)進行交互。

想像一下,你是一個機器人建造者。你有幾十個下屬機器人,每個機器人都可以擁有多種技能。假設你需要緊急完成一堵牆的建造。您只需將所有具有“建造”能力的機器人帶走,然後告訴它們建造牆即可。你真的不在乎是哪個機器人做的。讓它成為一個機器人噴壺。如果它知道如何構建,就讓它構建。

這是它在代碼中的樣子:

Java代碼 描述
static interface WallBuilder
{
void buildWall();
}
能夠“建造一堵牆”。理解命令«建造一堵牆»(有適當的方法)。
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();
   }
  }
 }
}
我們如何下達建造一堵牆的命令?

“這太有趣了。我做夢也沒想到界面會成為如此有趣的話題。”

“然後是一些!再加上多態性,這真是令人驚嘆。”