Интерфейс это перечень методов, а если чуть абстрагироваться, то это определенная
модель поведения и когда какой-то класс реализует интерфейс это означает, что он гарантированно поддерживает описанную в интерфейсе модель поведения. Тем самым если у вас есть определенный набор
разных классов (в данном случае это Цех и Отдел), но поддерживающих одну и ту же модель поведения (интерфейс Подразделение), то это позволяет вам взаимодействовать с ним не глядя на то, к какому конкретно классу они принадлежат.
Сценариев применения на практике - множество, но вот вам простейший:
Допустим у вас есть задача (взято с потолка) посчитать ежедневные затраты на питание всех сотрудников того или иного подразделения. В итоге получается, что нам нужен метод, который принимал бы в качестве аргумента экземпляр подразделения и возвращал бы конкретную сумму.
// Subdivision это тот самый интерфейс "Подразделение"
int getFoodCost(Subdivision subdivision) {
// допустим, что на каждого человека тратится по 300 руб в день
return subdivision.numberOfEmployers() * 300;
}
В результате мы получаем метод, который может работать абсолютно с любыми классами, которые реализуют интерфейс Subdivision. А вот если бы вы
не использовали интерфейс, а просто добавили бы в каждый класс по методу numberOfEmployers(), то для каждого класса пришлось бы писать свою версию getFoodCost().