"¡Hola, amigo! Soy yo, otra vez. Quiero darte otro punto de vista sobre las interfaces. Verás, la mayoría de las veces una clase es un modelo de un objeto en particular. Por el contrario, las interfaces son más como las habilidades o habilidades de un objeto. roles, en lugar del objeto mismo".

Por ejemplo, elementos como automóviles, bicicletas, motocicletas y ruedas se representan mejor como clases y objetos. Pero sus habilidades, como «Puedo moverme», «Puedo llevar personas» y «Puedo estacionar», están mejor representadas como interfaces. Mira este ejemplo:

codigo Java Descripción
interface Moveable
{
void move(String newAddress);
}
Corresponde a la capacidad de moverse.
interface Driveable
{
void drive(Driver driver);
}
Corresponde a la capacidad de moverse.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Corresponde a la capacidad de transportar carga.
class Wheel implements Moveable
{
...
}
Una clase de «rueda». Tiene la capacidad de moverse.
class Car implements Moveable, Drivable, Transport
{
...
}
Una clase de «coche». Tiene la capacidad de moverse, ser conducido por una persona y transportar carga.
class Skateboard implements Moveable, Driveable
{
...
}
Una clase de «skateboard». Tiene la capacidad de moverse y ser controlado por una persona.

Las interfaces simplifican enormemente la vida del programador. Los programas suelen tener miles de objetos, cientos de clases y solo un par de docenas de interfaces (roles). Hay pocos roles, pero se pueden combinar de muchas maneras (clases).

El punto es que no tienes que escribir código que defina la interacción con cualquier otra clase. Todo lo que tienes que hacer es interactuar con roles (interfaces).

Imagina que eres un constructor de robots. Tienes docenas de robots subordinados y cada uno de ellos puede tener múltiples habilidades. Supongamos que necesita terminar urgentemente de construir un muro. Simplemente toma todos los robots que tienen la capacidad de "construir" y diles que construyan el muro. Realmente no te importa qué robots lo hacen. Que sea una regadera robótica. Si sabe construir, que construya.

Así es como se vería en el código:

codigo Java Descripción
static interface WallBuilder
{
void buildWall();
}
Capacidad de «construir un muro». Entiende el comando «construir un muro» (tiene el método apropiado).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
Robots que tienen esta habilidad/habilidad.

Una regadera no puede construir un muro (no implementa la interfaz 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();
   }
  }
 }
}
¿Cómo damos la orden de construir un muro?

"Eso es increíblemente interesante. Nunca soñé que las interfaces podrían ser un tema tan interesante".

"¡Y algo más! Junto con el polimorfismo, es totalmente alucinante".