PHP 觀察者模式


1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,並自動更新。 
2:場景:一個事件發生後,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之後直接加入處理的邏輯。當更新的邏輯增多之後,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。 
3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。 


<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/17
 * Time: 16:59
 */
interface ObSubject {
    /**
     * 增加一個新的觀察者對象
     * @param Observer $observer
     */
    public function attach(UserObserver $observer,$name);
    /**
     * 刪除一個已註冊過的觀察者對象
     * @param Observer $observer
     */
    public function detach(UserObserver $observer,$name);
    /**
     * 通知所有註冊過的觀察者對象
     */
    public function notifyObservers($name);
}

class CreateObSubject implements ObSubject
{

    private static $_observers = [];

    public function attach(UserObserver $observer, $name)
    {
        return self::$_observers[$name] = $observer;
    }

    public function detach(UserObserver $observer, $name)
    {
        $index = array_search($observer, self::$_observers);
        if ($index === FALSE || ! array_key_exists($index, self::$_observers)) {
            return FALSE;
        }
        unset(self::$_observers[$index]);
        return TRUE;
    }
    public function notifyObservers($name = null,$options = [])
    {
        if (!is_array(self::$_observers)) {

            return FALSE;
        }
        foreach (self::$_observers as $key => $observer) {

            //可以單獨提醒一個具體的角色,否則就全部提示
            if($name)
            {
                if($key == $name)
                {
                    $observer->update($name,$options);
                }

            }else{

                $observer->update($name,$options);
            }

        }
        return TRUE;
    }
}
/**
 * 抽象觀察者角色
 */
interface UserObserver {
    /**
     * 更新方法
     */
    public function update($name = null,$options = []);
}

class User implements UserObserver
{
    public $name;
    public function __construct($name)
    {
        $this->name = $name;
    }

    public function update($name = null,$options = [])
    {
        var_dump($options);
        echo get_called_class().' ->> The notice is:'.$name."\r\n";
    }
}
class User01 implements UserObserver
{
    public $name;
    public function __construct($name)
    {
        $this->name = $name;
    }

    public function update($name = null,$options = [])
    {
        var_dump($options);
        echo get_called_class().' ->> The notice is:'.$name."\r\n";
    }
}
$obj = new CreateObSubject();
$u = new User('gaoxx');
$u01 = new User01('gaoxx');
//添加一個新的角色
$obj->attach($u,'gaoxx');
//添加一個新的角色
$obj->attach($u01,'gaoxx01');
$obj->notifyObservers(null,['age' => 11,'name' => 'zdfjsdhfjsdhj']);

運行結果:

D:\myapache\www\demo\guancazhe\User.php:90:
array(2) {
  'age' =>
  int(11)
  'name' =>
  string(13) "zdfjsdhfjsdhj"
}
User ->> The notice is:
D:\myapache\www\demo\guancazhe\User.php:104:
array(2) {
  'age' =>
  int(11)
  'name' =>
  string(13) "zdfjsdhfjsdhj"
}
User01 ->> The notice is:


通知到了所有角色,並且傳遞對應的參數,對於負責的業務不僅可以精簡代碼,還可以大大使得模塊之間的耦合性大大降低。


發佈了136 篇原創文章 · 獲贊 69 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章