觀察者模式
定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于他的對象都得到通知并自動更新.
目錄結(jié)構(gòu)
|obService #項目根目錄
|--Think #核心類庫
|----Loder.php #自動加載類
|----subJect #抽象被觀察者類
|----obServer #具體被觀察者
|----server #抽象觀察者接口
|----appServer.php #app端
|----webServer.php #web端
|--index.php #單一的入口文件
代碼實踐
抽象被觀察者 Think/subJect.php
<?php
/**
* 抽象被觀察者類
*/
namespace Think;
abstract class subJect{
//觀察者數(shù)組
private $servers = array();
//添加觀察者
public function addServer(server $server) {
$this->servers[] = $server;
echo '添加觀察者成功'.PHP_EOL;
}
//刪除觀察者
public function delServer(server $server) {
$serverType = false;
//查詢觀察者的值
$key = array_search($server,$this->servers);
if(!$key){
if($server === $this->servers[$key]){
unset($this->servers[$key]);
$serverType = true;
}
}
if($serverType){
echo '刪除觀察者成功'.PHP_EOL;
}else{
echo '觀察者不存在'.PHP_EOL;
}
}
//通知所有觀察者
public function notify() {
foreach ($this->servers as $server){
$server->update();
}
}
}
具體被觀察者 服務(wù)端 Think/obServer.php
<?php
/**
* 具體被觀察者 服務(wù)端
*/
namespace Think;
class obServer extends subJect{
//具體被觀察者業(yè)務(wù),發(fā)布一條消息,并通知所有客戶端
public function publish() {
echo '我發(fā)布了新更新'.PHP_EOL;
$this->notify();
}
}
抽象觀察者接口 Think/server.php
<?php
/**
* 抽象觀察者接口
*/
namespace Think;
interface server{
public function update();
}
具體觀察者類 web端 Think/webServer.php
<?php
/**
* web端
*/
namespace Think;
class webServer implements server{
public function update() {
echo 'web端接收到更新'.PHP_EOL;
}
}
具體觀察者類 app端 Think/appServer.php
<?php
/**
* app端
*/
namespace Think;
class appServer implements server{
public function update() {
echo 'app端接收到更新'.PHP_EOL;
}
}
自動加載 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
單一的入口文件index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
$server = new \Think\obServer();
$web = new \Think\webServer();
$app = new \Think\appServer();
//添加被觀察者
$server->addServer($web);
$server->addServer($app);
//被觀察者發(fā)布信息
$server->publish();
//刪除觀察者
$server->delServer($web);
//再次發(fā)布信息
$server->publish();
觀察者模式的一個關(guān)鍵詞就是觸發(fā),被觀察者動作觸發(fā)觀察者的做出對應(yīng)的響應(yīng).
上一篇 php設(shè)計模式之?dāng)?shù)據(jù)映射模式
下一篇 php設(shè)計模式之裝飾器模式