"Hej, Amigo! Det är jag - igen. Jag vill ge dig en annan syn på gränssnitt. Du förstår, för det mesta är en klass en modell av ett visst objekt. Däremot är gränssnitt mer som ett objekts förmågor eller roller, snarare än själva objektet."

Till exempel är saker som bilar, cyklar, motorcyklar och hjul bäst representerade som klasser och föremål. Men deras förmågor, som "Jag kan röra mig", "Jag kan bära människor" och "Jag kan parkera", är bättre representerade som gränssnitt. Kolla in det här exemplet:

Java-kod Beskrivning
interface Moveable
{
void move(String newAddress);
}
Motsvarar förmågan att röra sig.
interface Driveable
{
void drive(Driver driver);
}
Motsvarar förmågan att röra sig.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Motsvarar förmågan att bära last.
class Wheel implements Moveable
{
...
}
En "hjul" klass. Har förmågan att röra sig.
class Car implements Moveable, Drivable, Transport
{
...
}
En "bil" klass. Har förmågan att röra sig, köras av en person och bära last.
class Skateboard implements Moveable, Driveable
{
...
}
En "skateboard" klass. Har förmågan att röra sig och bli kontrollerad av en person.

Gränssnitt förenklar programmerarens liv avsevärt. Program har ofta tusentals objekt, hundratals klasser och bara ett par dussin gränssnitt (roller). Det finns få roller, men de kan kombineras på många sätt (klasser).

Hela poängen är att du inte behöver skriva kod som definierar interaktion med varannan klass. Allt du behöver göra är att interagera med roller (gränssnitt).

Föreställ dig att du är en robotbyggare. Du har dussintals underordnade robotar och var och en av dem kan ha flera färdigheter. Anta att du snabbt måste slutföra en vägg. Du tar bara alla robotar som har förmågan att "bygga" och säger åt dem att bygga muren. Du bryr dig inte riktigt vilka robotar som gör det. Låt det vara en robotvattenkanna. Om den vet hur man bygger, låt den bygga.

Så här skulle det se ut i koden:

Java-kod Beskrivning
static interface WallBuilder
{
void buildWall();
}
Förmåga att "bygga en vägg". Förstår kommandot «bygga en vägg» (har lämplig metod).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
Robotar som har denna förmåga/färdighet.

En vattenkanna kan inte bygga en vägg (den implementerar inte WallBuilder-gränssnittet).

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();
   }
  }
 }
}
Hur ger vi kommandot att bygga en mur?

"Det är otroligt intressant. Jag hade aldrig drömt om att gränssnitt kunde vara ett så intressant ämne."

"Och lite till! Tillsammans med polymorfism är det helt häpnadsväckande."