观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新.
目录结构
|obService #项目根目录
|--Think #核心类库
|----Loder.php #自动加载类
|----subJect #抽象被观察者类
|----obServer #具体被观察者
|----server #抽象观察者接口
|----appServer.php #app端
|----webServer.php #web端
|--index.php #单一的入口文件
代码实践
抽象被观察者 Think/subJect.php
<?php
/**
* 抽象被观察者类
*/
namespace Think;
abstract class subJect{
//观察者数组
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();
}
}
}
具体被观察者 服务端 Think/obServer.php
<?php
/**
* 具体被观察者 服务端
*/
namespace Think;
class obServer extends subJect{
//具体被观察者业务,发布一条消息,并通知所有客户端
public function publish() {
echo '我发布了新更新'.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);
//被观察者发布信息
$server->publish();
//删除观察者
$server->delServer($web);
//再次发布信息
$server->publish();
观察者模式的一个关键词就是触发,被观察者动作触发观察者的做出对应的响应.
上一篇 php设计模式之数据映射模式
下一篇 php设计模式之装饰器模式