In general I would say that the Observer pattern is not applicable to _Mathematica_ code, since in my experience most _Mathematica_ code is not event driven and the Observer pattern makes no sense without events.
But a GUI application taking a state-machine approach and using [`Refresh`](http://reference.wolfram.com/mathematica/ref/Refresh.html) with the option [`TrackedSymbols`](http://reference.wolfram.com/mathematica/ref/TrackedSymbols.html), however, can certainly implement the Observer pattern by means of a state-machine.
Here is a relatively brief working example:
SeedRandom[42];
Manipulate[
Row[{
Dynamic@Refresh[
If[event != "idle", update[]]; Column[{plot, mean}],
TrackedSymbols -> {event}],
Dynamic @ Refresh[event = "slider-n-changed"; "", TrackedSymbols -> {n}],
Dynamic @ Refresh[event = "slider-k-changed"; "", TrackedSymbols -> {k}],
Dynamic @ Refresh[event = "slider-z-changed"; "", TrackedSymbols -> {z}]}],
{n, 10, 25, 1, Appearance -> "Labeled"},
{k, 1, 10, 1, Appearance -> "Labeled"},
{{z, 200, "zoom"}, 100, 300, 25, Appearance -> "Labeled"},
{{event, "idle"}, ControlType -> None},
{{data, dataF[10]}, ControlType -> None},
{plot, ControlType -> None},
{{mean, meanF[data, 1.]}, ControlType -> None},
TrackedSymbols -> None,
ControlPlacement -> Bottom,
Initialization :> (
dataF[n_] := RandomInteger[{1, 100}, n];
plotF[data_, k_, z_] := ListPlot[k data, ImageSize -> z];
meanF[data_, k_] := Row[{"Mean = ", N@Mean[k data]}];
update[] := Module[{ev = event},
event = "idle";
Switch[ev,
"slider-n-changed",
data = dataF[n]; plot = plotF[data, k, z]; mean = meanF[data, k],
"slider-k-changed",
plot = plotF[data, k, z]; mean = meanF[data, k],
"slider-z-changed",
plot = plotF[data, k, z]];])]
![example][1]
Notice how the controls which produce the events are decoupled from the variables that determine the look-and-feel of the visual output in the content pane. This, essentially, implements the Observer pattern.
When the n-slider is moved, a new data set is computed and the plot and the mean are updated; when the k-slider is moved only the plot and the mean are updated; when the zoom slider is moved only the plot is updated.
Note: this answer is based on work published on-line by John Fultz, but any errors or awkwardness in the above code are entirely mine.
###References
1. http://12000.org/my_notes/event_driven_GUI_with_Manipulate/event_driven_manipulate.htm
2. http://www.mathkb.com/Uwe/Forum.aspx/mathematica/17130/Re-How-to-find-which-variable-caused-the-trigger-in-Manipulate
[1]: https://i.sstatic.net/M3ldP.png