Define a one-to-many dependency between objects so that when one object
changes state, all its dependents are notified and updated automatically.
- Need to change other objects when one object changes state, but the
other objects aren't necessarily known to the one object
- Need to avoid tightly coupling an object with its observers
- Abstract coupling between Subject and Observer
- Support for broadcast communciation
- Unexpected updates can be a significant performance hit