@ Кауэ Сильвейра привел хороший пример, но упустил упомянуть еще один важный аспект.
В общем, смысл интерфейсов состоит не в том, чтобы иметь меньше классов.Я полагаю, вы знакомы с терминами сцепления и сплоченности.Вы всегда хотите иметь код, который свободно связан и очень сплочен.Это означает, что вы не хотите, чтобы классы были зависимы друг от друга (связаны), но чтобы они разделяли некоторую логику в форме наследования, полиморфизма и т. Д. Эти концепции являются одними из основных столпов качественного проектирования ObjectOriented.Обязательно стоит прочитать об этом, если вы не знакомы с этими темами.
Если вернуться к вопросу, то у вас, как правило, будет какой-то дубликат, если вы имеете дело со сложной логикой, которая имеет много особых случаев.Но такие проблемы в большей степени связаны с другими шаблонами и принципами проектирования, которые предназначены исключительно для соблюдения принципа СУХОЙ и разрешения ситуаций таким образом, который обобщает подход к решению.
Основная идея интерфейсов - установить логическую структуру для классов, которая способствует единообразию манипулирования объектами.
Представьте себе систему фондовой биржи.Этот интерфейс имеет единственный метод с именем execute, который будет выполнять некоторую логику приложения.
public interface Order{
void execute();
}
Другими классами, которые могут реализовать этот интерфейс, могут быть Buy и Sell.Это выглядело бы примерно так:
public class Buy implement Order{
@Override
public void execute(){
//TODO: Some logic
}
}
Теперь и Buy, и Sell будут иметь похожий код, возможно, даже какой-то дубликат, но что более важно, - когда они реализуют один и тот же интерфейс, вы можете обрабатывать их в Единый путь .Вы можете иметь некоторый класс StockManager, который поместит и ордера на покупку, и ордера на продажу в Quee<Order>
.Отсюда можно сделать вывод, что при работе с таким Quee у вас будет возможность вызывать метод execute()
для любой реализации интерфейса Order.
Построение поверх предыдущего аргумента с использованием интерфейсов и некоторых другихфреймворки наподобие Spring, вы получаете возможность делать авто-электромонтаж.Это значительно уменьшает зависимость от классов реализации более низкого уровня, давая вам возможность изменять низкоуровневые классы, не влияя на обработчики верхнего уровня.Этот тип разработки приложений является обычной практикой в SOA (сервис-ориентированная архитектура).