php设计模式之观察者模式

观察者模式:能够更便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能性。

利用这种模式可以方便地创建一个对象(观察者),其可以用来“监视”另一个对象(被观察者)的状态。这样,就可以在不必完全重构某些核心对象(可以理解成被观察者)的情况下,向现有的应用层序填加额外的功能。

即是动态创建对象(观察者),根据被观察者的状态动态调用观察者动作行为。

1. 被观察者 添加观察者,(attach)

2. 根据被观察者动态调用观察者的行为,即运行观察者。(notify)

 

 

一、php库中定义的接口splSubject  splObserver

<?php

class Subject implements SplSubject {

    protected $_value;

    protected $_observers;

    public function __construct() {

        $this->_observers = new SplObjectStorage ();

    }

    public function attach(SplObserver $object) {

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

    }

    public function detach(SplObserver $object) {

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

    }

    public function notify() {

        foreach ( $this->_observers as $object ) {

            $object->update ( $this );

        }

    }

    public function setValue($value) {

        $this->_value = $value;

        $this->notify ();

    }

    public function getValue() {

        return $this->_value;

    }

}

class Observer implements SplObserver {

    public function update(SplSubject $subject) {

        var_dump ( "最后更新时间为:" . $subject->getValue () );

    }

}



date_default_timezone_get ( 'Asia/Shanghai' );



error_reporting ( E_ALL );

$subject = new Subject ();

$observer = new Observer ();

$subject->attach ( $observer );

$subject->setValue ( date( 'Y-m-d H:i:s' ), time () );


二 .自定义观察者模式

<?php

class order {



    protected $observers = array(); // 存放观察容器

     

    //观察者新增

    public function addObServer($type, $observer) {

        

        $this->observers[$type][] = $observer;

    }

    



    //运行观察者

    public function obServer($type) {

        if (isset($this->observers[$type])) {

            foreach ($this->observers[$type] as $obser) {

                $a = new $obser;

                $a->update($this); //公用方法

            }

        }

    }

     

    //下单购买流程

    public function create() {

        echo '购买成功';

        $this->obServer('buy'); // buy动作

    }

}



class orderEmail {

    public static function update($order) {

        echo '发送购买成功一个邮件';

    }

}

class orderStatus {

    public static function update($order) {

        echo '改变订单状态';

    }

}

$ob = new order;

$ob->addObServer('buy', 'orderEmail');

$ob->addObServer('buy', 'orderStatus');

$ob->create();

 

你可能感兴趣的:(观察者模式)