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 with the option TrackedSymbols, 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]];])] 
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.