天空之城

您当前位置>>首页>>PHP学习>>PHP设计模式>>PHP设计模式之:观察者模式

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

来源:新浪博客   时间:2014-03-30 19:06:08   编辑:administrator   阅读数:160

[导读]观察者模式属于行为模式,定义了对象间的一种一对多的依赖关系;当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新改变对象; 观察者模式可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表,让所有观察者各自实现公共的IObserver接口,以取消主体和依赖性对象之间的直接依赖关系;

观察者模式:

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

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

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

UML结构图:

代码实现:

示例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('这是内容');

 

PHP设计模式之:观察者模式
原文地址: http://blog.sina.com.cn/s/blog_6dbbafe001018y2a.html

上一篇:千万要避免的五种程序注释方式(转)
下一篇:PHP设计模式之:原型模式

    just do it
    天空之城天空之城