觀察者模式(Observer Pattern):
觀察者模式必須包含兩個角色:觀察者(Observer)和被觀察對象(Observable)。觀察者和被觀察者之間存在“觀察”的邏輯關系。當被觀察著發(fā)生改變時,觀察者就會觀察到這樣的變化,并作出相應的相應。觀察者模式完美地將觀察者和被觀察者的對象分離開。
觀察者模式的實現(xiàn)通常是一個對象通過添加一個方法使本身變得可觀察(Observable)。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者(Observer)使用該信息執(zhí)行的操作與可觀察的對象(Observable)無關。
下面以系統(tǒng)中的用戶列表為例,當新添加用戶時,用戶列表記錄器(觀察者)可以觀察此列表(被觀察者),代碼如下:
<?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";
}
}
// 只使用一個UserListLogger實例進行觀察
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("王五");
?>
觀察者模式的類關系圖:
觀察者模式的運行結果:
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。