PHP設計模式學習筆記: 觀察者模式
// 抽象的觀察者類,規定要有一個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('結束測試觀察者模式');</pre>結果:
開始測試觀察者模式新的最喜愛的水果是: 蘋果 新的最喜愛的水果是: 西瓜
結束測試觀察者模式</pre>