Uwaga: zostało to całkowicie przepisane z mojego wcześniejszego przykładu
Pomyśl o gniazdach zasilania. W każdym kraju polityka wysokiego poziomu mówi, że gniazdka zasilania są zawsze takie same. Nie ma znaczenia, skąd czerpiesz energię elektryczną (węgiel, gaz, energia jądrowa), gniazda na ścianie powinny zawsze wytwarzać taką samą moc, przez ten sam zestaw złączy.
Teraz możesz podłączyć dowolne urządzenie do tego gniazda, ponieważ wszystkie mają wspólny interfejs, „wtyczkę”. Polityka wysokiego poziomu nigdy nie musi dyktować żadnej części szczegółów implementacji. Po prostu podłącz coś i gotowe.
Teraz, jeśli masz urządzenie, które nie chce zasilania prądem przemiennym - być może działa ono na obwodzie prądu stałego 7 V - nadal możesz korzystać z tej polityki wysokiego poziomu, potrzebujesz tylko pewnego rodzaju adaptera między zasilaczem a urządzeniem. A ponieważ wszyscy mają takie same zasady wysokiego poziomu, producent może je wbudować w implementację bez żadnych zmian w polityce wysokiego poziomu. Osoba łącząca implementację z zasadami (ty, podłączając laptopa) tak naprawdę nie musi tego rozumieć.
Ponadto, jeśli producent chce sprzedawać to samo urządzenie w innym kraju, wystarczy opracować inny adapter. Tak więc ta sama implementacja może działać z wieloma politykami, podczas gdy ta sama polityka może uruchamiać wiele implementacji.
To doskonały przykład odwrócenia zależności.
Ale oto interesujący fragment: wróć do tego, co powiedziałem po raz pierwszy. „Nie ma znaczenia, skąd bierzesz prąd.” Jest to również szczegół implementacji. Nadrzędną zasadą jest nadal to, że wszystkie gniazda zasilania mają ten sam kształt i emitują ten sam rodzaj zasilania. Szczegóły implementacji niskiego poziomu dotyczą zarówno źródła energii elektrycznej, jak i jej przebiegu.
W kategoriach programowych oznacza to, że polityka wysokiego poziomu jest interfejsem (tam, gdzie obsługuje ją język. Inną formą DI jest pisanie na klawiaturze). Interfejs API zapewnia i aplikacja zużywa, a szczegóły implementacji niskiego poziomu są zarówno aplikacja go zużywa i sam interfejs API, z których żaden nie musi się rozumieć.
Do dopasowania tej samej implementacji do różnych zasad można użyć adapterów.