Lekce 12 - Observer (pozorovatel)
V minulé lekci, Bridge, jsme si ukázali návrhový vzor Bridge, který odděluje měnící se rozhraní od měnící se implementace tohoto rozhraní.
V dnešním tutoriálu Návrhové vzory GoF si představíme návrhový vzor Observer umožnující objektu spravovat řadu pozorovatelů, kteří reagují na změnu jeho stavu voláním svých metod.
Observer patří do návrhových vzorů chování. Mezi ně dále patří například Strategy, Template Method, State, Memento a další.
Motivace použití vzoru Observer
Vypořádání se se závislostmi je jeden ze stěžejních problémů při návrhu softwaru. Velmi často nám na konkrétním objektu závisí několik dalších. Např. instance uživatele v desktopové aplikaci změní svou adresu. Na tuto změnu však musí být upozorněny všechny otevřené formuláře a další dialogy, ve kterých jméno figuruje. Dále je třeba upozornit externí registr, který je využíván při zasílání katalogů poštou.
Z hlediska návrhu není vhodné touto logikou zatěžovat objekt uživatele. Ten by neměl vědět o objektech, které na něm závisí, protože by ho to dělalo zbytečně složitým a nepřehledným. Díky vzoru Observer může být uživatel od těchto objektů odstíněn.
Specifikace vzoru Observer
Pozorovaný objekt je ve vzoru označen jako Predmet
. Ten je
abstraktní třídou a obsahuje metody pro přidání,
odstranění a zavolání pozorovatelů. Observer
je objekt
závislý na předmětu. Predmet
dědí z abstraktní třídy
Observer
(pozorovatel) a tak implementuje rozhraní, které ho
umožňuje na změnu předmětu upozornit. Předmět si na abstraktní úrovni
spravuje kolekci svých pozorovatelů. UML diagram návrhového vzoru Observer
je následující:

Při změně stavu na sobě předmět zavolá metodu upozornit()
a o více se nestará. Metoda je implementována v abstraktní třídě
Predmet
a proiteruje kolekci jeho pozorovatelů. Na nich je
zavolána metoda obnovit()
, čímž se jejich stav stane opět
konzistentní.
Vzor se využívá v systémech, které jsou založené na zpracování událostí.
V následujícím kvízu, Kvíz - Flyweight, Composite, Bridge, Observer ve Vzory GOF, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.