Connect components together through abstraction
A mechanism to decouple an interface from an implementation
A stronger form of encapsulation

Motivation

Prevent Cartesian product complexity explosion

Implementation