Decouple an abstraction from its implementation allowing the two to vary independently.
Provide a surrogate or placeholder for another object to control access to it.
Without violating encapsulation, capture and externalize an object’s internal state allowing the object to be restored to this state later.