PHP深入观察者模式

php中文网
发布: 2016-06-20 12:34:45
原创
1089人浏览过

####观察者模式* 设计观察者是为了让一个对象跟踪某个状态,知道状态如何改变,一旦状态改变,所有订阅的对象都能得到通知#####使用SPL实现观察者模式* Splsubject 接口有三个抽象方法 attach(),detach(),notify()这些方法不返回任何结果* SplObserver 接口有一个方法update()它会得到subject状态的最新状态并交给观察者实例* SplObjectStorage 类描述为从对象到数据或对象集的一个映射```<?php/** * Created by PhpStorm. * User: gewenrui * Date: 16/3/14 * Time: 下午7:46 *///继承Splsubject接口class ConcreteSubject implements SplSubject{    private $observers;    private $data;    //实例化仓库    public function setObservers(){        $this->observers = new SplObjectStorage();    }    //添加观察者    public function attach(\SplObserver $observer){        $this->observers->attach($observer);    }	//删除观察者    public function detach(\SplObserver $observer){        $this->observers->detach($observer);    }    //通知转发    public function notify(){        foreach($this->observers as $observer){            $observer->update($this);        }    }    //设置数据    public function setData($dataNow){        $this->data = $dataNow;    }    public function getData(){        return $this->data;    }}//SPL具体观察者class ConcreteObserver implements SplObserver{    public function update(SplSubject $subject)    {      echo $subject->getData();    }}class Client{    public function __construct()    {        echo "<p> create three new concrete observers ";        //创建观察者        $ob1 = new concreteobserver();        $ob2 = new concreteobserver();        $ob3 = new concreteobserver();        $subject = new concretesubject();        $subject->setobservers();        $subject->setdata("here is u data"."</br>");        $subject->attach($ob1);        $subject->attach($ob2);        $subject->attach($ob3);        $subject->notify();        echo "<p> reset data and reattach ob3</p>";        $subject->setData("more data that only"."</br>");        $subject->attach($ob3);        $subject->attach($ob2);        $subject->notify();    }}$data = new Client();```#####自由的PHP和观察者模式```<?php/** * Created by PhpStorm. * User: gewenrui * Date: 16/3/14 * Time: 下午8:24 */namespace abbbbb;//一个接口,一个抽象类,一个继承抽象类的具体类//观察者实体实现借口类interface Observer{    function update(Subject $subject);}abstract  class Subject{    protected $stateNow;    protected $observers = array();    public function attachObser(Observer $obser){        //array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。        array_push($this->observers,$obser);    }    public function detachObser(Observer $obser){        //从数组中移除 数据        $position = 0;        foreach($this->observers as $viwer){            ++$position;            if($viwer == $obser){                array_splice($this->observers,($position),1);            }        }    }    public function notify(){        foreach($this->observers as $viewer){            //调用update方法            $viewer->update($this);        }    }}class ConcreteSubject extends Subject{    public function setState($stateSet){        $this->stateNow = $stateSet;    }    public function getState(){        return $this->stateNow;    }}class ConcreteObserverDT implements Observer{    private $currentState;    public function update(Subject $subject)    {       $this->currentState = $subject->getState();        echo "DT";    }}class ConcreObserverTablet implements Observer{    private $currentState;    public function update(Subject $subject)    {        $this->currentState = $subject->getState();        echo "tablet";    }}class ConcreObserverPhone implements Observer{    private $currentState;    public function update(Subject $subject)    {        $this->currentState = $subject->getState();        echo "phone";    }}class Client{    public function __construct()    {        $sub = new ConcreteSubject();        $ob1 = new ConcreObserverPhone();        $ob2 = new ConcreObserverTablet();        $ob3 = new ConcreteObserverDT();        $sub->attachObser($ob1);        $sub->attachObser($ob2);        $sub->attachObser($ob3);        $sub->setState("fuck");        $sub->detachObser($ob1);        $sub->notify();    }}$data = new Client();```
登录后复制

千帆大模型平台
千帆大模型平台

面向企业开发者的一站式大模型开发及服务运行平台

千帆大模型平台 0
查看详情 千帆大模型平台
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号