程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP設計模式——觀察者模式

PHP設計模式——觀察者模式

編輯:關於PHP編程

PHP設計模式——觀察者模式


 

 

 

觀察者模式(有時又被稱為發布-訂閱模式)。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。

 

UML類圖:

\

 

重要角色:

抽象通知者角色(INotifier):定義了通知的接口規則。

具體通知者角色(Boss):實現抽象通知者的接口,接到狀態改變立即向觀察者下發通知。

抽象觀察者角色(IObserver):定義接到通知後所做的操作(Update)接口規則。

具體觀察者角色(JingDong):實現具體操作方法。

 

核心代碼:

 

//抽象通知者
abstract class Subject
{
    private $observers = array();

    public function  Attach(Observer $observer)
    {
        array_push($this->observers,$observer);
    }

    public function  Detach(Observer $observer)
    {
        foreach($this->observers as $k=>$v)
        {
            if($v==$observer)
            {
                unset($this->observers[$k]);
            }
        }
    }

    function  Notify()
    {
        foreach($this->observers as $v)
        {
            $v->Update();
        }
    }
}

//具體通知者(Boss和Secretary)
class ConcreteSubject extends Subject
{
   public $subject_state;
}

//抽象觀察者
abstract class Observer
{
    public abstract function Update();
}

//具體觀察者
class ConcreteObserver extends Observer
{
    private $name;
    private $observerState;
    public $subject;

    public function __construct(ConcreteSubject $_sub,$_name)
    {
        $this->subject = $_sub;
        $this->name = $_name;
    }

    public function  Update()
    {
        $this->observerState = $this->subject->subject_state;
        echo 觀察者.$this->name.的新狀態是:.$this->observerState.
;
    }
}

 

 

調用客戶端代碼:

 

header(Content-Type:text/html;charset=utf-8);
//-------------------------觀察者模式-----------------------
require_once ./Observe/Observe.php;
//前台
$_s = new ConcreteSubject();

//寶銀
$baoyin = new ConcreteObserver($_s, 張三);
$jiangchao = new ConcreteObserver($_s,李四);

//前台記下寶銀姜超
$_s->Attach($baoyin);
$_s->Attach($jiangchao);

//前台發現老板回來
$_s->subject_state = 孫總回來了;

//前台發送通知
$_s->Notify();

 

 

優點:

1、一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。

2、一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。

3、一個對象必須通知其他對象,而並不知道這些對象是誰。需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved