Они полезны, когда вы хотите указать набор общих методов и свойств, которые имеют все классы, которые реализуют / наследуют от них, с открытым поведением, которое все должны обеспечивать.
В частности, в отношении интерфейсов класс может реализовывать несколько интерфейсов, поэтому это удобно, когда вы пытаетесь смоделировать тот факт, что его экземпляры должны демонстрировать несколько типов поведения.
Кроме того, как указывает Википедия , интерфейс - это определение типа: где бы ни передавался объект в качестве параметра в вызове функции или метода, тип объекта, подлежащего обмену, может быть определен в термины интерфейса вместо конкретного класса, что позволяет позднее использовать одну и ту же функцию для обмена объектами разных типов: следовательно, такой код оказывается более универсальным и пригодным для повторного использования.