„Здравей, Амиго! Отново съм аз. Искам да ти дам друга гледна точка за интерфейсите. Виждаш ли, през повечето време един клас е модел на конкретен обект. За разлика от това интерфейсите са по-скоро като способности на обект or роли, а не самия обект."

Например неща като автомобor, велосипеди, мотоциклети и колела са най-добре представени като класове и обекти. Но техните способности, като „Мога да се движа“, „Мога да нося хора“ и „Мога да паркирам“, са по-добре представени като интерфейси. Вижте този пример:

Java code Описание
interface Moveable
{
void move(String newAddress);
}
Съответства на способността за движение.
interface Driveable
{
void drive(Driver driver);
}
Съответства на способността за движение.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Съответства на способността за пренасяне на товари.
class Wheel implements Moveable
{
...
}
Клас "колело". Има способността да се движи.
class Car implements Moveable, Drivable, Transport
{
...
}
Клас "автомобил". Има способността да се движи, да се управлява от човек и да носи товари.
class Skateboard implements Moveable, Driveable
{
...
}
Клас "скейтборд". Има способността да се движи и да се контролира от човек.

Интерфейсите значително опростяват живота на програмиста. Програмите много често имат хиляди обекти, стотици класове и само няколко дузини интерфейси (роли). Има малко роли, но те могат да се комбинират по много начини (класове).

Целият смисъл е, че не е нужно да пишете code, дефиниращ взаимодействие с всеки друг клас. Всичко, което трябва да направите, е да взаимодействате с роли (интерфейси).

Представете си, че сте робот строител. Имате десетки подчинени роботи и всеки от тях може да има множество умения. Да предположим, че трябва спешно да завършите изграждането на стена. Просто взимате всички роботи, които имат способността да „строят“ и им казвате да построят стената. Всъщност не ви интересува кои роботи го правят. Нека да е роботизирана лейка. Ако знае How да строи, нека строи.

Ето How ще изглежда в code:

Java code Описание
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();
   }
  }
 }
}
Как да дадем команда за изграждане на стена?

„Това е невероятно интересно. Никога не съм си представял, че интерфейсите могат да бъдат толкова интересна тема.“

"И след това малко! Заедно с полиморфизма, това е напълно умопомрачително."