Вот база например: ты можешь напрямую писать запросы, но они зависят от диалекта. Или же ты можешь сделать репозиторий, в котором есть findByID() не твоё приложение уже не волнует из какой именно базы ты будешь читать данные. Тебе нужно захешировать пароль: ты можешь напрямую юзать bcrypt например, а можешь сделать интерфейс Hasher с методом Hash и Check, и не волноваться, как именно ты потом эти пароли будешь хешить.
Примеров может быть много, у условной модели User тебе больше интересны конкретные значения полей, а у условного NotificationSender только метод Send. Тогда User - структура, а NotificationSender - интерфейс, который потом реализуй как хочешь