"Deal with delegating responsibilities to other objects."
"Allows the conversion of the interface of a class to another interface that client expects. Communicate incompatible interfaces."
"Allows the separation of an abstract interface from its implementation."
"Avoid coupling a (request) sender object to a receiver object. Allows a sender object to pass its request along a chain of objects without having any knowledge about which object will handle the request."
"Extends the functionality of an objects in a manner that is transparent to its clients without using inheritance."
"Provide a higher level interface to a subsystem of classes, making the subsystem easier to use."
"Allows a separate object to be used as a substitute to provide controlled access to an object that is not accessible by normal means."
- Virtual proxy: Helps to create objects on demand (until required)
- Counting proxy: To provide some kind of audit mechanism before executing a method on a target object.