PHP 觀察者模式

<?php
/**
 * 觀察者模式
 * 觀察者抽象類
 * 具體觀察者類
 * 被觀察類抽象
 * 具體觀察類
 * --------------------------
 * 被觀察者 保存 觀察者的實例
 * 當被觀察者改動時,調用觀察者實例調用 update 傳入$this
 * 通知觀察者數據更新
 */

/**
 * Class ObeServer
 * 觀察者 抽象類
 */
abstract class AObeServer
{
    abstract public function update(AComputer $AComputer);
}

/**
 * Class Object
 * 觀察者 具體類
 */
class ObeServer extends AObeServer
{
    protected $objectName;
    function __construct($name)
    {
        $this->objectName = $name;
    }

    public function update(AComputer $AComputer)
    {
        // TODO: Implement update() method.
        $data = $AComputer->GetState();
        echo '這裏是觀察者'.$this->objectName.'監聽到變化'.$data.PHP_EOL;
    }

}

/**
 * Class AComputer
 * 被觀察的目標抽象類
 */
abstract class AComputer
{
    // 存放觀察者
    protected static $_computer;

    // 自動構造初始化
    public function __construct()
    {
        isset(self::$_computer) ? '' : self::$_computer = [];
    }

    // 添加一個觀察者
    public function Add(AObeServer $obeServer)
    {
        if (!in_array($obeServer, self::$_computer)) {
            self::$_computer[] = $obeServer;
        }
    }

    // 刪除一個觀察者
    public function Remove(AObeServer $obeServer)
    {
        if (in_array($obeServer, self::$_computer)) {
            $key = self::$_computer[] = $obeServer;
            unset(self::$_computer[$key]);
        }
    }

    // 通知觀察者
    public function Notify()
    {
        foreach (self::$_computer as $key => $val) {
            $val->update($this);
        }
    }

    abstract public function SetState($state);

    abstract public function GetState();
}

/**
 * Class DellComputer
 * 被觀察對象實例
 */
class DellComputer extends AComputer
{
    protected $_dell;

    public function SetState($state)
    {
        // TODO: Implement SetState() method.
        $this->_dell = $state;
    }

    public function GetState()
    {
        // TODO: Implement GetState() method.
        return $this->_dell;
    }

}

// 建立觀察者實例
$one_obe_server = new ObeServer('one');
$two_obe_server = new ObeServer('two');

// 建立被觀察對象
$computer = new DellComputer();
// 被觀察者註冊添加觀察者
$computer->Add($one_obe_server);
$computer->Add($two_obe_server);
// SetState改變狀態,Notify通知
$computer->SetState(1);
$computer->Notify();
// 輸出
// 這裏是觀察者one監聽到變化1
// 這裏是觀察者two監聽到變化1
相關文章
相關標籤/搜索