Pros:
- Easy unit tests
- Decoupling - Dependencies can be configured, wrapped, changed, mocked, all without changing the parent
- Coding towards an interface - We can depend on only the things we need, no more and no less
- Ability to write code using the dependency you wish you had. Make that thing later.
Cons:
- Indirection
- Too much decoupling. Sometimes, things should stay together.