Как вы сказали, интерфейсы используются для указания контрактов , которым должны следовать классы, которые их реализуют.Сценарии, в которых они используются, обычно представляют собой сценарий, в котором вы вызываете класс, который реализует определенный интерфейс.Тот факт, что реализует определенный интерфейс, дает вам знание того, что данный класс, действительно реализует данный набор методов.Обычно вам не важно, что происходит в этих методах, для вас важно, чтобы у класса были эти методы.
В качестве примера вы можете рассмотреть Шаблон проектирования наблюдателя .По сути, у вас есть один объект, который имеет состояние, которое он разделяет с другими объектами, и передает им уведомления, когда некоторые из его данных изменяются.
Итак, если, например, все наблюдатели реализуют следующий интерфейс:
public interface Observer
{
notify();
}
Субъект может без каких-либо знаний о своих наблюдателях сделать что-то вроде этого:
public class MySubject...
{
List<Observer> observers;
.....
public void notifyAll()
{
for (Observer observer : observers)
{
observer.notify();
}
}
}
Как видите, класс MySubject
не имеет никаких знаний окак Observer реализует метод notify
, что его действительно волнует, так это то, что он реализует его.Это позволяет создавать разных наблюдателей, которые по-разному реализуют свой собственный класс notify
, не требуя каких-либо изменений в классе MySubject
.
Интерфейсы также обеспечивают определенную безопасность типов.Интерфейсы обычно также удобны, когда у вас есть ряд классов, реализующих серию схожих поведений, которые вы обычно хотите сохранить в некоторой типизированной структуре данных.Обычно это хорошая работа вокруг факта, что Java не позволяет множественное наследование.Итак, в приведенном выше примере я могу иметь неограниченное количество разных классов.Но пока все они реализуют интерфейс Observer
, все они могут быть добавлены в один и тот же список.
В методах notifyAll
я могу просто перебирать элементы списка вместо проверки того, относится ли элемент к определенному типу, и затем приводить его, что может привести к дополнительным накладным расходам при выполнении программы..