- Наблюдатель (модель)
-
Наблюдатель, Observer — поведенческий шаблон проектирования. Также известен как «подчинённые» (Dependents), «издатель-подписчик» (Publisher-Subscriber).
Содержание
Назначение
Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.
Реализация
При реализации шаблона «наблюдатель» обычно используются следующие классы.
- Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей.
- Observer — интерфейс, с помощью которого наблюдаемый объект оповещает наблюдателей.
- ConcreteObservable — конкретный класс, который реализует интерфейс Observable.
- ConcreteObserver — конкретный класс, который реализует интерфейс Observer.
Область применения
Шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:
- существует, как минимум, один объект, рассылающий сообщения
- имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.
Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают с предоставленной им информацией получатели.
Примеры
PHP5
interface Observer{ function notify($obj); } class ExchangeRate{ static private $instance = NULL; private $observers = array(); private $exchange_rate; private function ExchangeRate(){ } static public function getInstance(){ if(self::$instance == NULL){ self::$instance = new ExchangeRate(); } return self::$instance; } public function getExchangeRate(){ return $this->$exchange_rate; } public function setExchangeRate($new_rate){ $this->exchange_rate = $new_rate; $this->notifyObservers(); } public function registerObserver($obj){ $this->observers[] = $obj; } function notifyObservers(){ foreach($this->observers as $obj){ $obj->notify($this); } } } class ProductItem implements Observer{ public function __construct(){ ExchangeRate::getInstance()->registerObserver($this); } public function notify($obj){ if($obj instanceof ExchangeRate) { // Update exchange rate data print "Received update!\n"; } } } $product1 = new ProductItem(); $product2 = new ProductItem(); ExchangeRate::getInstance()->setExchangeRate(4.5);
Поведенческие шаблоны проектирования Interpreter/Интерпретатор | Template Method/Шаблонный метод | Chain of Responsibility/Цепочка обязанностей | Iterator/Итератор, Cursor | Mediator/Посредник | Memento/Хранитель, Token | Observer/Наблюдатель, Listener | State/Состояние | Strategy/Стратегия | Visitor/Посетитель | Event listener | Single-serving visitor | Hierarchical visitor |
Wikimedia Foundation. 2010.