觀察者模式 是一種行為型設計模式,定義了對象之間的一對多依賴關係:當一個對象(被觀察者/主題)狀態發生改變時,所有依賴它的對象(觀察者)都會自動收到通知並更新。正如《松本行弘的程式世界》所言,這能有效降低對象間的耦合度。
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
// 被觀察者
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();
?>
// 被觀察者
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 接口。「設計模式不是為了炫技,而是為了應對變化。」—— 通過三種語言的實踐,你已掌握觀察者模式的精髓,可在任何語言中靈活應用。