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

觀察者模式多語言實現全解析:Ruby、PHP、JavaScript 代碼實戰

     編輯:Java 相關知識

什麼是觀察者模式?

觀察者模式 是一種行為型設計模式,定義了對象之間的一對多依賴關係:當一個對象(被觀察者/主題)狀態發生改變時,所有依賴它的對象(觀察者)都會自動收到通知並更新。正如《松本行弘的程式世界》所言,這能有效降低對象間的耦合度。

經典場景:時間顯示系統

  • 傳統硬編碼:獲取時間的方法內部直接包含顯示邏輯,導致獲取時間功能無法複用。
  • 觀察者模式:分離「計時器」(被觀察者)與「顯示器」(觀察者)。計時器只負責發送通知,顯示器自行決定如何展示。未來新增顯示方式(如 GUI、日誌、語音播報)完全不需要修改計時器代碼。

Ruby 實現(最簡潔)

Ruby 內建 Observable 模組,幾行代碼即可完成:

require "observer"

# 被觀察者
class Subject
  include Observable

  def notify
    # 執行業務邏輯...
    changed         # 設置 changed 標記為 true
    notify_observers(*args)  # 通知所有觀察者,可傳參數
  end
end

# 觀察者
class Obs
  def update(*args)
    # 處理通知...
  end
end

# 使用
sub = Subject.new
sub.add_observer(Obs.new)
sub.notify

Observable 模組還提供實用方法:

  • delete_observer(obj) 刪除特定觀察者
  • delete_observers 清空所有觀察者
  • count_observers 獲取觀察者數量
  • changed? 檢查 changed 標記

PHP 實現(手動管理觀察者列表)

<?php
// 被觀察者
class Subject {
    private $_observers = [];

    public function __construct() {}

    public function add_observer($obs) {
        $this->_observers[] = $obs;
    }

    public function delete_observer($obs) {
        $index = array_search($obs, $this->_observers, true);
        if ($index !== false) unset($this->_observers[$index]);
    }

    public function notify_observers() {
        foreach ($this->_observers as $v) {
            $v->update();
        }
    }
}

// 觀察者
class Observer {
    public function __construct() {}
    public function update() { /* do sth */ }
}

// 使用
$sub = new Subject();
$obs = new Observer();
$sub->add_observer($obs);
$sub->notify_observers();
?>

JavaScript 實現(ES5 風格,易於理解)

// 被觀察者
function Subject() {
    var _this = this;
    this.observers = [];

    this.addObserver = function(obj) {
        _this.observers.push(obj);
    };

    this.deleteObserver = function(obj) {
        var len = _this.observers.length;
        for (var i = 0; i < len; i++) {
            if (_this.observers[i] === obj) {
                _this.observers.splice(i, 1);
                break;
            }
        }
    };

    this.notifyObservers = function() {
        var len = _this.observers.length;
        for (var i = 0; i < len; i++) {
            _this.observers[i].update();
        }
    };
}

// 觀察者
function Observer() {
    this.update = function() {
        alert(1); // 實際業務邏輯
    };
}

// 使用
var sub = new Subject();
var obs = new Observer();
sub.addObserver(obs);
sub.notifyObservers();

三種實現對比總結

語言特點優勢
Ruby內建模組支援代碼極簡、語義清晰、專注業務邏輯
PHP手動管理數組中規中矩、易於理解、符合傳統 OOP 風格
JavaScript函數式/原型風格靈活多變、適應瀏覽器/Node.js 環境

核心優勢回顧

  • 解耦:被觀察者不依賴具體觀察者實現,只依賴抽象 update 接口。
  • 複用:計時邏輯與顯示邏輯完全分離,各自可獨立演化。
  • 擴展:新增觀察者零修改被觀察者,符合開閉原則。

「設計模式不是為了炫技,而是為了應對變化。」—— 通過三種語言的實踐,你已掌握觀察者模式的精髓,可在任何語言中靈活應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved