觀察者模式(Observer Pattern):
觀察者模式必須包含兩個(gè)角色:觀察者(Observer)和被觀察對(duì)象(Observable)。觀察者和被觀察者之間存在“觀察”的邏輯關(guān)系。當(dāng)被觀察著發(fā)生改變時(shí),觀察者就會(huì)觀察到這樣的變化,并作出相應(yīng)的相應(yīng)。觀察者模式完美地將觀察者和被觀察者的對(duì)象分離開。
觀察者模式的實(shí)現(xiàn)通常是一個(gè)對(duì)象通過添加一個(gè)方法使本身變得可觀察(Observable)。當(dāng)可觀察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。這些觀察者(Observer)使用該信息執(zhí)行的操作與可觀察的對(duì)象(Observable)無關(guān)。
下面以系統(tǒng)中的用戶列表為例,當(dāng)新添加用戶時(shí),用戶列表記錄器(觀察者)可以觀察此列表(被觀察者),代碼如下:
<?php
interface IObserver {
function onChanged($sender, $args);
}
interface IObservable {
function addObserver($observer);
}
class UserList implements IObservable {
private $_observers = array();
function addObserver($observer) {
$this->_observers[] = $observer;
}
function addUser($name) {
foreach($this->_observers as $obj) {
$obj->onChanged($this, $name);
}
}
function __toString() {
return "UserList";
}
}
// 只使用一個(gè)UserListLogger實(shí)例進(jìn)行觀察
class UserListLogger implements IObserver {
private static $instance = null;
private function __construct() {}
public static function getInstance() {
if(self::$instance == null) {
self::$instance = new UserListLogger();
}
return self::$instance;
}
function onChanged($sender, $args) {
echo $args . "被添加到用戶列表" . $sender . "中<br>";
}
}
$ul = new UserList();
$ul->addObserver(UserListLogger::getInstance());
$ul->addUser("趙二");
$ul->addUser("張三");
$ul2 = new UserList();
$ul2->addObserver(UserListLogger::getInstance());
$ul2->addUser("李四");
$ul->addUser("王五");
?>
觀察者模式的類關(guān)系圖:
觀察者模式的運(yùn)行結(jié)果:
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。