观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
观察者模式实现了低耦合,非侵入式的通知与更新机制

 

 


/**
 * PHP内置	SplObserver[观察者]  SplSubject[被观察者]  SplObjectStorage[存放观察者的类]
 */

/**
 * 被观察者
 */
class Articel implements SplSubject {

    private $storage;

    const POST_STATUS_SUCCESS = 1;
    const POST_STATUS_ERROR = 2;

    function __construct() {
        $this->storage = new SplObjectStorage();
    }

    /**
     * 添加观察者
     * @param SplObserver $observer
     */
    function attach(SplObserver $observer) {
        $this->storage->attach($observer);
    }

    /**
     *  移除观察者
     * @param SplObserver $observer
     */
    function detach(SplObserver $observer) {
        $this->storage->detach($observer);
    }

    /**
     * 通知观察者 执行更新
     */
    function notify() {
        foreach ($this->storage as $obs) {
            $obs->update($this);
        }
    }

    /**
     * 被观察者执行任务[并执行通知操作]
     * @param type $content
     */
    function postArticle($content = '') {
        if (empty($content)) {
            echo "POST ERROR!!!";
        } else {
            echo "POST SUCCESS!!!";
        }
        $this->notify();
    }

}

/**
 * 观察者抽象类
 */
abstract class ArticleObserver implements SplObserver {

    private $article;

    /**
     * 传入被观察者,并执行被观察者的添加观察者方法
     * @param Articel $article
     */
    function __construct(Articel $article) {
        $this->article = $article;
        $article->attach($this);
    }

    /**
     * 实现更新方法,并指向真正执行更新的方法
     * @param SplSubject $subject
     */
    function update(SplSubject $subject) {
        if ($subject === $this->article) {
            $this->doUpdate($subject);
        }
    }

    /**
     * 抽象方法 由子类实现
     */
    abstract function doUpdate(Articel $article);
}

/**
 * 邮件观察者
 */
class ArticleEmail extends ArticleObserver {

    function doUpdate(Articel $article) {
        //发送邮件的实现
        print __class__ . ".\t post article success \n";
    }

}

/**
 * 短信观察者
 */
class ArticleSms extends ArticleObserver {

    function doUpdate(Articel $article) {
        //发送邮件的实现
        print __class__ . ".\t post article success \n";
    }

}

//创建被观察者
$article = new Articel();

//添加观察者
new ArticleEmail($article);

//添加观察者
new ArticleSms($article);

//被观察者执行任务
$article->postArticle('1231234');

点赞(3519) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部