加载中…
正文 字体大小:

PHP设计模式之:观察者模式

(2012-09-17 17:14:58)
标签:

php

设计模式

观察者模式

科技

宋体

分类: PHP设计模式

观察者模式:

观察者模式属于行为模式,定义了对象间的一种一对多的依赖关系;当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新改变对象;

观察者模式可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表,让所有观察者各自实现公共的IObserver接口,以取消主体和依赖性对象之间的直接依赖关系;

阅读示例代码将更好的理解观察者模式;

UML结构图:

PHP设计模式之:观察者模式

 

代码实现:

示例1

 

<?php

/1**

 观察者模式

 */

 

/1*

//PHP已经提供的接口SplSubject、SplObserver,无需重新定义

//当然可以定义自己的接口ISubject、IObserver

interface SplSubject

{

function attach(SplObserver $observer);

function detach(SplObserver $observer);

function notify();

}

 

interface SplObserver

{

function update(SplSubject $subject);

}

*/

 

/1**

 实现接口的类

 */

class Subject implements SplSubject

{

    private $observers array();   //初始化变量为空数组,用于存放观察者对象(实例)

 

    /1**

     

     添加观察者对象

     @param SplObserver $observer

     */

    public function attach(SplObserver $observer)  //需要指定接口SplObserver

    {

        if(!in_array($observer,$this->observers))

        {

            $this->observers[] $observer;

        }

    }

 

    /1**

     

     移除观察者

     @param SplObserver $observer

     */

    public function detach(SplObserver $observer)

    {

        if(false != ($index array_search($observers,$this->observers)))

        {

            unset($this->observers[$index]);

        }

    }

 

    /1**

      

      传递信息、通知给观察者

      */

    public function post()

    {

        $this->notify();

    }

 

    /1**

     

     生成状态修改通知,通知观察者

     */

    public function notify()

    {

        foreach($this->observers as $observer)

        {

            $observer->update($this);

        }

    }

 

    /1**

      

     状态更新改变

      @param unknown_type $count

      */

    public function setCount($count)

    {

        echo '数据量加'.$count.'<br />';

    }

 

    public function setIntegral($integral)

    {

        echo '积分加'.$integral.'<br />';

    }

}

 

/1**

 

 观察者Observer1

 @author Administrator

 *

 */

class Observer1 implements SplObserver

{

    public function update(SplSubject $subject) //需要指定接口SplSubject满足兼容性

    {

        $subject->setCount(1);

    }

}

 

/1**

 

 观察者Observer2

 @author Administrator

 *

 */

class Observer2 implements SplObserver

{

    public function update(SplSubject $subject)

    {

        $subject->setIntegral(10);

    }

}

 

//客户端

class Client

{

    public static function test()

    {

        $subject new Subject();

        $subject->attach(new Observer1());

        $subject->attach(new Observer2());

        $subject->post();   //输出:数据量加1 积分加10

    }

}

 

Client::test();


示例2

<?php

/1**

 观察者模式(被观察者)

 */

 

class Subject implements SplSubject

{

    /1**

     设置参数

     */

    protected $_value;   //通知的值

    protected $_observers   //用于保存观察者对象

 

    /1**

     构造函数

     */

    public function __construct()

    {

        $this->_observers new SplObjectStorage();

    }

 

    /1**

     

     添加观察者

     @param SplObserver $observer

     */

    public function attach(SplObserver $observer)

    {

        $this->_observers->attach($observer);

    }

 

    /1**

     

     移除观察者

     @param SplObserver $observer

     */

    public function detach(SplObserver $observer)

    {

        $this->_observers->detach($observer);

    }

 

    /1**

     通知观察者

     */ 

    public function notify()

    {

        foreach($this->_observers as $observer)

        {

            $observer->update($this);

        }

    }

 

    /1**

     

     设置最新的值

     @param unknown_type $value

     */

    public function setValue($value)

    {

        $this->_value $value;

        $this->notify();

    }

 

    /1**

     

     获取最后更新的值

     */

    public function getValue()

    {

        return $this->_value;

    }

}

 

/1**

 观察者1

 */

class Observer1 implements SplObserver

{

    public function update(SplSubject $subject)

    {

        echo '<b>对象</b>:</b>'.get_class().<b>内容:</b>'.$subject->getValue().'<br />';

    }

}

 

/1**

 观察者2

 */

class Observer2 implements SplObserver

{

    public function update(SplSubject $subject)

    {

        echo '<b>对象:</b>'.get_class().<b>内容:</b>'.$subject->getValue().'<br />';

    }

}

 

//实现

$subject  new Subject();

$object1  new Observer1();

$object2  new Observer2();

$subject->attach($object1);

$subject->attach($object2);

$subject->setValue('这是内容');

 

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有