PHP 设计模式-观察者模式

设计模式 287 浏览

    什么是观察者模式?

    一个对象被设置成可观察时,它的状态发生了变化或触发了某个事件,其他依赖它的对象全部会收到通知,并自动更新。

    为什么使用观察者模式?

    当发生某个事件后,我们需要对其他对象进行操作。比如登录后,我们需要更新用户的登录时间,传统的方式就是在事件的代码之后直接加入处理的逻辑;下次可能用户异地登录,我们又需要给用户推送消息;每次增加新的逻辑都需要修改事件的主体代码,这种是耦合性的、侵入式的。

    说这么多也没啥用,我们还是直接看实例:

/**
 * 观察者接口
 * Interface IObserver
 */
interface IObserver
{
    public function update($sender, $msg);

    public function getClassName();
}

/**
 * 观察者A
 * Class ObserverA
 */
class ObserverA implements IObserver
{
    public function update($sender, $msg)
    {
        echo $sender,':','观察者A,',$msg,"\n";
    }

    public function getClassName()
    {
        return get_class();
    }
}

/**
 * 观察者B
 * Class ObserverA
 */
class ObserverB implements IObserver
{
    public function update($sender, $msg)
    {
        echo $sender,':','观察者B,',$msg,"\n";
    }

    public function getClassName()
    {
        return get_class();
    }
}

/**
 * 通知者接口
 * Interface INotifier
 */
interface INotifier
{
    // 添加观察者
    function addObserver( $observer );

    // 移除观察者
    function removeObserver( $observer );

    // 通知观察者
    function notify( $observer );
}

/**
 * 通知者A
 * Class NotifierA
 */
class NotifierA implements INotifier
{
    // 观察者对象
    private $_observers = array();

    public function addObserver($observer)
    {
        $class_name = $observer->getClassName();
        $this->_observers[$class_name]= $observer;
    }

    public function removeObserver($observerName) {
        if ( isset($this->_observers[$observerName]) )
        {
            unset($this->_observers[$observerName]);
        }
        return true;
    }

    public function notify($msg)
    {
        $notifier = get_class();
        foreach( $this->_observers as $observer )
        {
            $observer->update( $notifier, $msg );
        }
    }
}

$A = new NotifierA();// 通知者A
$A->addObserver( new ObserverA() );// 添加观察者A
$A->addObserver( new ObserverB() );// 添加观察者B
$A->notify( "老师来了" );// 广播消息给观察者

//NotifierA:观察者A,老师来了
//NotifierA:观察者B,老师来了

    实例中通知者 NotifierA 也就是被观察者,它设置了两个观察者ObserverA、ObserverB。当触发了老师来了的事件后,通知者广播所有观察者,观察者们收到消息并作出处理。

|  版权声明:本文为博主原创文章,转载请注明出处。