Шаблон программирования Observer

Шаблон программирования Observer (Наблюдатель, Dependents, Подчиненные, Publisher-Subscriber, Издатель-Подписчик) используется для оповещения зависимых объектов при изменения состояния наблюдаемого объекта.

UML диаграмма классов шаблона Observer

Пример использования шаблона программирования Observer:
interface Observer { // Observer
    function handleEvent($obj);
}

class Cache implements Observer { // ConcreteObserver
    public function __construct() {
        Content::getInstance()->addObserver($this);
    }
    
    public function handleEvent($obj) {
        if($obj instanceof Content) {
            echo 'Объект Content сообщает об обновлении в объект Cache<br />';
            $this->clear();
        }
    }
    
	public function clear() {
		echo 'Кеш очищен<br />';
	}
}

class Content { // ConcreteObservable
    static private $instance = null;
    private $observers = array();
    
    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}
    
    static public function getInstance() {
        if(self::$instance == null) {
            self::$instance = new Content();
        }
        return self::$instance;
    }
    
    public function addObserver(Observer $obj) {
        $this->observers[] = $obj;
    }
    
    public function removeObserver(Observer $obj) {
        $newObservers = array();
        foreach ($this->observers as $obs) {
            if ($obj !== $obs) {
                $newObservers[] = $obs;
            }
        }
        $this->observers = $newObservers;
    }
    
    public function notifyObservers() {
        foreach($this->observers as $obj) {
            $obj->handleEvent($this);
        }
    }
    
    public function change() {
        echo 'Изменение контента<br />';
        $this->notifyObservers();
    }
}

$content = Content::getInstance();
$cache = new Cache();
$content->change();
// Изменение контента
// Объект Content сообщает об обновлении в объект Cache
// Кеш очищен

Метки: ,

Оставить комментарий

Вы должны авторизоваться для отправки комментария.