PHP設計模式學習筆記: 觀察者模式

jopen 10年前發布 | 13K 次閱讀 PHP設計模式 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>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!