设计模式学习(二)、观察者模式
1观察者模式的概念:
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖你它的对象都回收到通知,并自动更新。
2.观察者模式的结构图
3.观察者模式角色说明
抽象主题(subject)角色:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象,实现抽象主题所要求的注册、移出、通知接口;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Oberver)角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteOberver)角色:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
4..观察者模式的实现
<?php /** * Created by PhpStorm. * User: Administrator * Date: 16-10-11 * Time: 上午11:56 */ interface Subject { public function register($observer); public function notify(); public function remove($observer); } interface Observer { public function update(); } Class ConcreteSubject implements Subject { public $observerArr; public function register($observer){ if(!in_array($observer,$this->observerArr)) $this->observerArr[] = $observer; } public function remove($observer){ if(in_array($observer,$this->observerArr)) $this->observerArr = array_merge(array_diff($this->observerArr, array($observer))); } public function notify(){ foreach($this->observerArr as $oberver) $oberver->updade(); } } Class ConcreteObserver implements Observer { public function __construct($subject){ $subject->register($this); } public function update(){ echo 'concrete observer is update'; } } $subject = new ConcreteSubject(); $observer = new ConcreteObserver($subject); $subject->notify();