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>