觀察者模式定義物件間的一對多依賴關係:當主題物件狀態改變時,所有依賴它的觀察者都會收到通知並自動更新。這是實現「發布-訂閱」機制的經典模式。
<?php
// 主題:報紙
class Paper {
private array $_observers = [];
// 註冊觀察者
public function register(Observerable $sub): void {
$this->_observers[] = $sub;
}
// 觸發通知
public function trigger(): void {
if (!empty($this->_observers)) {
foreach ($this->_observers as $observer) {
$observer->update();
}
}
}
}
// 觀察者介面
interface Observerable {
public function update(): void;
}
// 具體觀察者:訂閱者
class Subscriber implements Observerable {
public function update(): void {
echo "Callback\n";
}
}
// 測試
$paper = new Paper();
$paper->register(new Subscriber());
// $paper->register(new Subscriber1());
// $paper->register(new Subscriber2());
$paper->trigger(); // 輸出: Callback
新增觀察者只需在主題中註冊並實現介面,完全不修改主題代碼,完美符合開放封閉原則,大幅降低耦合度。