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