Nota: esto ha sido completamente reescrito de mi ejemplo anterior
Piensa en tomas de corriente. En cualquier nación, la política de alto nivel es que los enchufes de energía son siempre los mismos. No importa de dónde obtenga la electricidad (carbón, gas, nuclear), los enchufes en la pared siempre deben emitir la misma cantidad de energía, a través del mismo conjunto de conectores.
Ahora puede enchufar cualquier dispositivo en ese zócalo, porque todos tienen una interfaz común, el "enchufe". La política de alto nivel nunca tiene que dictar ninguna parte de ese detalle de implementación. Simplemente conecte algo y listo.
Ahora, si tiene un dispositivo que no quiere alimentación de CA, tal vez se ejecuta en un circuito de CC de 7 V, aún puede usar esa política de alto nivel, solo necesita algún tipo de adaptador entre la fuente de alimentación y el dispositivo. Y, dado que todos tienen la misma política de alto nivel, el fabricante puede incorporarla a la implementación, sin ningún cambio en la política de alto nivel. La persona que conecta la implementación a la política (usted, conectando su computadora portátil) tampoco necesita entenderlo.
Además, si el fabricante quiere vender el mismo dispositivo en otro país, todo lo que tiene que hacer es desarrollar un adaptador diferente. Entonces, la misma implementación puede funcionar con múltiples políticas, mientras que la misma política puede ejecutar múltiples implementaciones.
Este es un ejemplo perfecto de inversión de dependencia.
Pero aquí está lo interesante: regrese a lo que dije por primera vez. "No importa de dónde obtengas la electricidad". Este también es un detalle de implementación. La política de alto nivel sigue siendo que todos los enchufes tienen la misma forma y emiten el mismo tipo de energía. Los detalles de implementación de bajo nivel son tanto de dónde proviene la electricidad como a qué se dirige.
En términos de programación, eso significa que la política de alto nivel es la interfaz (donde un lenguaje lo admite. Otra forma de DI es el tipeo de pato) que proporciona una API y la aplicación consume, y los detalles de implementación de bajo nivel son ambos la aplicación la consume y la API en sí, ninguna de las cuales necesita entenderse entre sí.
Los adaptadores pueden usarse para ajustar la misma implementación en diferentes políticas.