Dependency is an important topic, because it will determine how easily you can make changes to your system. The Dependency Inversion principle help to make a system more robust and flexible.
The principle states that high level modules should depend on high level generalizations, and not on low level details. This means that the client classes should depend on an interface or abstract class instead of referencing to concrete resources.
High level resources: interfaces and abstract classes.
Low level resources: concrete class.
Class diagram comparison between the low and high level resources:


High level dependency will prevent client class to be directly coupled with a specific concrete class. This means that a client class is dependent on expected behaviors, not on specific implementation of behaviors.
