<?php /** * 觀察者模式 * 觀察者抽象類 * 具體觀察者類 * 被觀察類抽象 * 具體觀察類 * -------------------------- * 被觀察者 保存 觀察者的實例 * 當被觀察者改動時,調用觀察者實例調用 update 傳入$this * 通知觀察者數據更新 */ /** * Class ObeServer * 觀察者 抽象類 */ abstract class AObeServer { abstract public function update(AComputer $AComputer); } /** * Class Object * 觀察者 具體類 */ class ObeServer extends AObeServer { protected $objectName; function __construct($name) { $this->objectName = $name; } public function update(AComputer $AComputer) { // TODO: Implement update() method. $data = $AComputer->GetState(); echo '這裏是觀察者'.$this->objectName.'監聽到變化'.$data.PHP_EOL; } } /** * Class AComputer * 被觀察的目標抽象類 */ abstract class AComputer { // 存放觀察者 protected static $_computer; // 自動構造初始化 public function __construct() { isset(self::$_computer) ? '' : self::$_computer = []; } // 添加一個觀察者 public function Add(AObeServer $obeServer) { if (!in_array($obeServer, self::$_computer)) { self::$_computer[] = $obeServer; } } // 刪除一個觀察者 public function Remove(AObeServer $obeServer) { if (in_array($obeServer, self::$_computer)) { $key = self::$_computer[] = $obeServer; unset(self::$_computer[$key]); } } // 通知觀察者 public function Notify() { foreach (self::$_computer as $key => $val) { $val->update($this); } } abstract public function SetState($state); abstract public function GetState(); } /** * Class DellComputer * 被觀察對象實例 */ class DellComputer extends AComputer { protected $_dell; public function SetState($state) { // TODO: Implement SetState() method. $this->_dell = $state; } public function GetState() { // TODO: Implement GetState() method. return $this->_dell; } } // 建立觀察者實例 $one_obe_server = new ObeServer('one'); $two_obe_server = new ObeServer('two'); // 建立被觀察對象 $computer = new DellComputer(); // 被觀察者註冊添加觀察者 $computer->Add($one_obe_server); $computer->Add($two_obe_server); // SetState改變狀態,Notify通知 $computer->SetState(1); $computer->Notify(); // 輸出 // 這裏是觀察者one監聽到變化1 // 這裏是觀察者two監聽到變化1