觀察者模式又稱發布-訂閱模式,是物件導向設計中實現「一對多」依賴關係的經典方案。當一個目標物件狀態發生變化時,所有依賴它的觀察者物件都能收到通知並自動更新。此模式廣泛應用於事件驅動系統、消息推送、模型-視圖同步等場景。

update())。<?php
// 抽象通知者
abstract class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$key = array_search($observer, $this->observers, true);
if ($key !== false) unset($this->observers[$key]);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update();
}
}
}
// 具體通知者
class ConcreteSubject extends Subject {
public $subjectState;
}
// 抽象觀察者
abstract class Observer {
abstract public function update();
}
// 具體觀察者
class ConcreteObserver extends Observer {
private $name;
private $observerState;
public $subject;
public function __construct(ConcreteSubject $subject, $name) {
$this->subject = $subject;
$this->name = $name;
}
public function update() {
$this->observerState = $this->subject->subjectState;
echo "觀察者 {$this->name} 的新狀態是: {$this->observerState}\n";
}
}
?>
<?php
header('Content-Type: text/html; charset=utf-8');
require_once './Observe/Observe.php';
// 前台建立主題
$subject = new ConcreteSubject();
// 註冊觀察者
$baoyin = new ConcreteObserver($subject, '張三');
$jiangchao = new ConcreteObserver($subject, '李四');
$subject->attach($baoyin);
$subject->attach($jiangchao);
// 狀態變更並通知
$subject->subjectState = '孫總回來了';
$subject->notify();
?>