天天看點

PHP設計模式-觀察者模式

<?php
/** 觀察者 */
interface IObserver
{
    function onChanged( $sender, $args );
}

/** 被觀察者 */
interface IObservable
{
    function addObserver( $observer );
}

/** 實作被觀察者接口 */
class UserList implements IObservable
{
    private $_observers = array();

    /** 實作具體業務 */
    public function addCustomer( $name )
    {
        //TODO 實作業務邏輯

        //通知觀察者
        foreach( $this->_observers as $obs )
            $obs->onChanged( $this, $name );
    }

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

/** 實作觀察者接口 */
class UserListLogger implements IObserver
{
    public function onChanged( $sender, $args )
    {
        /** 應用場景業務 */
        echo( "'$args' added to user list\n" );
    }
}

class sendMsg implements IObserver
{
    public function onChanged($sender, $args)
    {
        /** 應用場景業務 */
        echo ($args." send msg to user");
    }
}

$ul = new UserList();
/** 添加應用場景 */
$ul->addObserver(new UserListLogger());
$ul->addObserver(new sendMsg());

/** 觸發事件 */
$ul->addCustomer( "Arlin" );