Примечание: это было полностью переписано из моего предыдущего примера
Подумайте о розетках. В любой стране политика высокого уровня заключается в том, что розетки всегда одинаковы. Неважно, откуда вы получаете электричество (уголь, газ, атомная энергия), розетки на стене всегда должны давать одинаковое количество энергии через один и тот же набор разъемов.
Теперь вы можете подключить любое устройство к этому разъему, потому что все они имеют общий интерфейс, «штекер». Политика высокого уровня никогда не должна диктовать какую-либо часть этой детали реализации. Просто подключите что-нибудь и все готово.
Теперь, если у вас есть устройство, которое не требует питания от сети переменного тока - возможно, оно работает на цепи 7 В постоянного тока - вы все равно можете использовать эту политику высокого уровня, вам просто нужен какой-то адаптер между источником питания и устройством. И поскольку у всех одинаковая политика высокого уровня, производитель может встроить ее в реализацию без каких-либо изменений политики высокого уровня. Человеку, связывающему реализацию с политикой (вы подключаете свой ноутбук), на самом деле тоже не нужно понимать.
Кроме того, если производитель хочет продать то же устройство в другой стране, все, что ему нужно сделать, - это разработать другой адаптер. Таким образом, одна и та же реализация может работать с несколькими политиками, а одна и та же политика может выполнять несколько реализаций.
Это прекрасный пример инверсии зависимостей.
Но вот интересный момент: вернитесь к тому, что я впервые сказал. «Неважно, откуда вы получаете электричество». Это также деталь реализации. Политика высокого уровня по-прежнему заключается в том, что все розетки питания имеют одинаковую форму и излучают одинаковый тип питания. Низкоуровневые детали реализации - это то, откуда и откуда идет электричество.
В терминах программирования это означает, что высокоуровневая политика - это интерфейс (где язык поддерживает его. Другой формой DI является типизация утки.), Который предоставляет API, и приложение потребляет, и детали реализации низкоуровневого уровня являются приложение потребляет его и сам API, ни один из которых не должен понимать друг друга.
Адаптеры могут использоваться для встраивания одной и той же реализации в разные политики.