Observer
Consequences
The Observer pattern lets you vary subjects and observers
independently. You can reuse subjects without reusing their
observers, and vice versa. It lets you add observers without
modifying the subject or other observers.
Further benefits and liabilities of the Observer pattern include the
following:
- Abstract coupling between Subject and Observer.
All a subject knows is that it has a list of observers, each
conforming to the simple interface of the abstract Observer class.
The subject doesn't know the concrete class of any observer. Thus the
coupling between subjects and observers is abstract and minimal.
Because Subject and Observer aren't tightly coupled, they can belong to
different layers of abstraction in a system. A lower-level subject
can communicate and inform a higher-level observer, thereby keeping the
system's layering intact. If Subject and Observer are lumped
together, then the resulting object must either span two layers (and
violate the layering), or it must be forced to live in one layer or
the other (which might compromise the layering abstraction).
- Support for broadcast communication.
Unlike an ordinary request, the notification that a subject sends
needn't specify its receiver. The notification is broadcast
automatically to all interested objects that subscribed to it. The
subject doesn't care how many interested objects exist; its only
responsibility is to notify its observers. This gives you the freedom
to add and remove observers at any time. It's up to the observer to
handle or ignore a notification.
- Unexpected updates.
Because observers have no knowledge of each other's presence, they can
be blind to the ultimate cost of changing the subject. A seemingly
innocuous operation on the subject may cause a cascade of updates to
observers and their dependent objects. Moreover, dependency criteria
that aren't well-defined or maintained usually lead to spurious
updates, which can be hard to track down.
This problem is aggravated by the fact that the simple update protocol
provides no details on what changed in the subject. Without
additional protocol to help observers discover what changed, they may
be forced to work hard to deduce the changes.