Observer
Observer je možné použít v situaci, kdy je definována závislost jednoho objektu na druhém. Závislost ve smyslu propagace změny nezávislého objektu závislým objektům (pozorovatelům). Nezávislý objekt musí informovat závislé objekty o událostech, které je mohou ovlivnit.
Možná vám to připomíná klasický mechanismus zpracování událostí (Event / Listener), není to však příliš daleko od skutečnosti. Životní cyklus události se skládá z následujících kroků...
- Vznik události (typicky vzniká uživatelskou akcí nad komponentou GUI - např. stisknutí tlačítka).
- Na komponentu, která je zdrojem události je "zavěšen" posluchač dané události
- Zdroj události (tlačítko) projde seznam registrovaných posluchačů a každému z nich oznámí vznik události - zavolá dohodnutou metodu rozhraní posluchače, metodě předá informace o události
Observer se nasazuje se v situacích, kdy objekt, který mění své chování (komponenta) a jeho pozorovatelé neudržují navzájem žádné vazby a jejich propojení musí být tudíž zprostředkováno pomocí jejich supertříd. Smysl této nepřímé invokace spočívá v tom, že o přidání nového pozorovatele není nutné informovat (a tím měnit i zdrojový kód) pozorovaný objekt, ale stačí pouze vytvořit novou třídu, která je specializací třídy Pozorovatel (Observer) a její instance přidat do množiny pozorujících objektů prostřednictvím operace připoj (attach).
Příklad Posluchače:
Objekt třídy Faktura implementuje operaci zaplacena takovým způsobem, že v okamžiku, kdy je tato zpráva obdržena objekt informuje manažera a prodejce zasláním zprávy odešli na instance třídy SMSBrána a stejně tak zasílá zprávu zobraz na instanci třídy MonitorPlateb.
Kdybychom tento příklad implementovali standardním způsobem tak, vytvoříme přímou vazbu tříd SMS brána a MonitorPlateb na Fakturu. Každá faktura by musela vědět o svých pozorovatelích, pamatovat si je a zaslat jim odpovídající zprávy. Zavedením dalšího nového pozorovatele by znamenalo upravit zdrojový kód Faktury.
Proto zavedeme návrhový vzor Pozorovatel a přidáme další dvě supertřídy Předmět a Pozorovatel.
Třída předmět zavádí operace přidání a odebrání instancí třídy Pozorovatel a operaci oznam, která v případě svého provedení odešle na všechny zaregistrované pozorovatele zprávu aktualizuj. Třída Pozorovatel tedy zavádí operaci aktualizuj, která je jednotlivými podtřídami předefinována tak, aby odpovídajícím způsobem dokázaly jednolivé instance správně reagovat – instance třídy SMSBrána odešle textovouzprávu, zatímco instance třídy MonitorPlateb zobrazí informaci o zaplacení faktury na obrazovku. Operace oznam je vyvolána podtřídou třídy Předmět, v našem případě se jedná o výše zmíněnou třídu Faktura.