- Deal with objects delegating responsibilities to other objects. This results in a layered architecture of components with a low degree of coupling.
- Facilitate inter-object communication when one object is not accessible to the other by normal means or when an object is not usable because of its incompatible interface.
- Provide ways to structure an aggregate object so that it is created in full and to reclaim system resources in a timely manner.
Designing objects to satisfy particular project constraints.
These work with the way objects are connected with other objects to ensure that changes in the system do not require changes to those connections.