Почти каждая прочитанная Java-книга рассказывает об использовании интерфейса как способа совместного использования состояния и поведения между объектами, которые, когда первые "построенные", похоже, не разделяют отношения.
Однако, всякий раз, когда я вижу, как архитекторы разрабатывают приложение, первое, что они делают, - это запустить программирование интерфейса. Как так? Откуда вы знаете все отношения между объектами, которые произойдут в этом интерфейсе? Если вы уже знаете эти отношения, то почему бы просто не расширить абстрактный класс?