9
Wzorzec observer należy do wzorców czynnościowych. W praktyce umożliwia on powiadamianie obiektów (obserwatorów) o zmianie danych obiektu czy klasy centralnej (obserwowanej) dając możliwość wielokrotnego wykorzystywania klas bez zbędnych modyfikacji ich kodu czyniąc go przy tym czytelniejszym i bardziej przejrzystym.
Aby pokazać działanie wzorca observer posłużę się prostym przykładem. Załóżmy, że mamy klasę modyfikującą dane w bazie  i chcemy aby w momencie zapisu zmienionych danych został utworzony plik z cachem zawierającym nowe dane oraz aby informacja o tych zmianach trafiła do administratora.
Zacznę od stworzenia interfejsu dla obiektów obserwatorów, który zawierać będzie definicje metody update:
- 
interface IObserver
- 
{
- 
function update();
- 
}
Następnie stworzę 2 klasy obserwatorów implementujące powyższy interfejs, jedna odpowiedzialna będzie za utworzenie nowego cache'u a druga za powiadomienie admina o zmianach:
- 
class CacheObserver implements IObserver
- 
{
- 
/**
- 
* Metoda zapisuje nowe dane do cache
- 
*/
- 
function update()
- 
{
- 
// zapis danych do cache
- 
// [...]
- 
}
- 
}
- 
- 
class MailObserver implements IObserver
- 
{
- 
/**
- 
* Metoda wysyla maila do admina
- 
*/
- 
function update()
- 
{
- 
// wyslanie maila do admina
- 
// [...]
- 
}
- 
}
Mając już obserwatorów utworzę klasę centralną (obserwowaną) czyli w naszym przykładzie modyfikującą dane osoby w bazie:
- 
class ModifyObservable
- 
{
- 
/**
- 
* Tablica obserwatorow
- 
*
- 
* @var array
- 
* @access private
- 
*/
- 
- 
/**
- 
* Metoda dodaje obserwatora
- 
*
- 
* @param object Obiekt obserwatora
- 
*/
- 
function addObserver($observer)
- 
{
- 
$this->_observers[] = $observer;
- 
}
- 
- 
/**
- 
* Metoda powiadamia swoich obserwatorow o uaktualnieniu
- 
*/
- 
function notify()
- 
{
- 
foreach($this->_observers as $observer) {
- 
$observer->update();
- 
}
- 
}
- 
- 
/**
- 
* Metoda dokonuje modyfikacji danych
- 
*/
- 
function update()
- 
{
- 
// modyfikacja danych
- 
// [...]
- 
- 
// powiadomienie obserwatorow
- 
$this->notify();
- 
}
- 
}
Metoda update() w klasie Modify aktualizuje dane oraz wywołuje metodę notify(), która to poprzez cykliczne wywołanie metod update() swoich obserwatorów (CacheObserver i MailObserver)
- 
$modify = new ModifyObservable();
- 
$modify->addObserver(new CacheObserver());
- 
$modify->addObserver(new MailObserver());
- 
$modify->update();
Jak więc widać wzorzec ten jest dość prosty w implementacji i daje nam wymierne korzyści takie jak możliwość wielokrotnego wykorzystywania klas bez zbędnych modyfikacji kodu, unikanie trwałych i sztywnych zależności między klasami, czytelny i przejrzysty kod.
Więcej na temat wzorca observer:
http://pl.wikipedia.org/wiki/Wzorzec_obserwatora
http://4programmers.net/PHP/Wzorce_Projektowe#id-Obserwator
http://www.phppatterns.com/docs/design/observer_pattern
http://www.fluffycat.com/PHP-Design-Patterns/Observer/
http://www.vincehuston.org/dp/observer.html
Leave a Reply
You must be logged in to post a comment.