首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 設計模式深度解析:觀察者模式實戰

     編輯:PHP 相關知識

PHP 設計模式深度解析:觀察者模式實戰

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

核心角色與 UML 結構

觀察者模式 UML 類圖

  • 抽象通知者:定義註冊、移除、通知觀察者的介面規範。
  • 具體通知者:實現抽象介面,持有觀察者集合,狀態改變時觸發通知。
  • 抽象觀察者:定義接收通知後的更新操作介面(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();
?>

模式優勢總結

  1. 解耦合:主題與觀察者僅通過抽象介面耦合,可獨立變化復用。
  2. 動態關係:運行時可任意增減觀察者,無需修改主題代碼。
  3. 觸發鏈支援:可構建 A→B→C 的鏈式觸發機制,實現複雜事件流。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved