观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新.
目录结构
|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设计模式之装饰器模式