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.