美文网首页我爱编程
php设计模式之观察者模式

php设计模式之观察者模式

作者: 小山人 | 来源:发表于2018-06-21 11:44 被阅读0次

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新.

目录结构

|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设计模式之装饰器模式

相关文章

网友评论

    本文标题:php设计模式之观察者模式

    本文链接:https://www.haomeiwen.com/subject/sasqyftx.html