Nota: isso foi completamente reescrito no meu exemplo anterior
Pense em tomadas de energia. Em qualquer nação, a política de alto nível é que os soquetes de energia sejam sempre os mesmos. Não importa de onde você obtenha eletricidade (carvão, gás, energia nuclear), as tomadas na parede devem sempre fornecer a mesma quantidade de energia, através do mesmo conjunto de conectores.
Agora você pode conectar qualquer dispositivo a esse soquete, porque todos eles têm uma interface comum, o "plug". A política de alto nível nunca precisa ditar nenhuma parte desses detalhes de implementação. Basta conectar algo e pronto.
Agora, se você tiver um dispositivo que não deseja energia CA - talvez seja executado em um circuito de 7V CC - ainda poderá usar essa política de alto nível, apenas precisará de algum tipo de adaptador entre a fonte de alimentação e o dispositivo. E, como todos têm a mesma política de alto nível, o fabricante pode incorporá-lo à implementação, sem nenhuma alteração na política de alto nível. A pessoa que está conectando a implementação à política (você conectando o laptop) também não precisa entender.
Além disso, se o fabricante quiser vender o mesmo dispositivo em outro país, tudo o que eles precisam fazer é desenvolver um adaptador diferente. Portanto, a mesma implementação pode funcionar com várias políticas, enquanto a mesma política pode executar várias implementações.
Este é um exemplo perfeito de inversão de dependência.
Mas aqui está a parte interessante: Volte ao que eu disse pela primeira vez. "Não importa de onde você tira eletricidade." Este também é um detalhe de implementação. A política de alto nível ainda é a de que todos os soquetes de energia têm a mesma forma e emitem o mesmo tipo de energia. Os detalhes de implementação de baixo nível são de onde vem a eletricidade e o que é executado.
Em termos de programação, isso significa que a política de alto nível é a interface (onde uma linguagem a suporta. Outra forma de DI é a digitação de pato.) Que uma API fornece e o aplicativo consome, e os detalhes de implementação de baixo nível são os seguintes: aplicativo consumindo-o e a própria API, nenhum dos quais precisa se entender.
Os adaptadores podem ser usados para ajustar a mesma implementação em políticas diferentes.