PHP设计模式学习笔记: 观察者模式
jopen
10年前
// 抽象的观察者类,规定要有一个update方法 abstract class AbstractObserver { abstract function update(AbstractSubject $subject_in); } // 抽象的主题类 abstract class AbstractSubject { abstract function attach(AbstractObserver $observer_in); abstract function detach(AbstractObserver $observer_in); abstract function notify(); } function writeln($line_in) { echo $line_in.PHP_EOL; } // 观察者类的子类 class FruitbuyerObserver extends AbstractObserver { public function __construct() { } public function update(AbstractSubject $subject) { writeln('新的最喜爱的水果是: '.$subject->getFavorites()); } } // 主题类的子类 class FruitbuyerSubject extends AbstractSubject { private $favoritePatterns = NULL; private $observers = array(); function __construct() { } function attach(AbstractObserver $observer_in) { $this->observers[] = $observer_in; } function detach(AbstractObserver $observer_in) { foreach($this->observers as $okey => $oval) { if ($oval == $observer_in) { unset($this->observers[$okey]); } } } function notify() { foreach($this->observers as $obs) { $obs->update($this); } } function updateFavorites($newFavorites) { $this->favorites = $newFavorites; $this->notify(); } function getFavorites() { return $this->favorites; } } writeln('开始测试观察者模式'); writeln(''); $fruitbuyer = new FruitbuyerSubject(); $fruitbuyerObserver = new FruitbuyerObserver(); // 把一个观察者放进$fruitbuyer的已知观察者名单中,现在$fruitbuyer有了一个观察者对象 $fruitbuyer->attach($fruitbuyerObserver ); // 这步是关键,先把“苹果”加入水果买家的最爱列表 // 接着该updateFavorites()操作会调用已注册的(目前只有一个)所有观察者自身的update()方法 // 就是说告知(notify)所有的观察者们,让他们都知道$fruitbuyer最喜欢的水果是“苹果” $fruitbuyer->updateFavorites('苹果'); // 现在换成了西瓜,$fuitbuyer一旦更改了喜好,同时会告知所有的观察者们,现在观察者们也知道了新的喜好是“西瓜” $fruitbuyer->updateFavorites('西瓜'); // 去掉一个观察者 $fruitbuyer->detach($fruitbuyerObserver ); // 现在因为没有了观察者,所以$fruitbuyer更新了喜好为黄瓜,但是能通知谁呢?没人知道他喜欢的是“黄瓜”了哦~~~ $fruitbuyer->updateFavorites('黄瓜'); writeln(''); writeln('结束测试观察者模式');结果:
开始测试观察者模式 新的最喜爱的水果是: 苹果 新的最喜爱的水果是: 西瓜 结束测试观察者模式