PHP設(shè)計(jì)模式——觀察者模式

觀察者模式(有時(shí)又被稱為發(fā)布-訂閱模式)。在此種模式中,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。

UML類圖:


圖片.png

重要角色:

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

具體通知者角色(Boss):實(shí)現(xiàn)抽象通知者的接口,接到狀態(tài)改變立即向觀察者下發(fā)通知。

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

具體觀察者角色(JingDong):實(shí)現(xiàn)具體操作方法。
核心代碼:

//抽象通知者
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."的新狀態(tài)是:".$this->observerState."<br/>";
    }
}

測(cè)試代碼:

header("Content-Type:text/html;charset=utf-8");
//-------------------------觀察者模式-----------------------
require_once "./Observe/Observe.php";
//前臺(tái)
$_s = new ConcreteSubject();
 
//寶銀
$baoyin = new ConcreteObserver($_s, "張三");
$jiangchao = new ConcreteObserver($_s,"李四");
 
//前臺(tái)記下寶銀姜超
$_s->Attach($baoyin);
$_s->Attach($jiangchao);
 
//前臺(tái)發(fā)現(xiàn)老板回來
$_s->subject_state = "孫總回來了";
 
//前臺(tái)發(fā)送通知
$_s->Notify();

優(yōu)點(diǎn):

1、一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一個(gè)方面。將這些方面封裝在獨(dú)立的對(duì)象中使它們可以各自獨(dú)立地改變和復(fù)用。

2、一個(gè)對(duì)象的改變將導(dǎo)致其他一個(gè)或多個(gè)對(duì)象也發(fā)生改變,而不知道具體有多少對(duì)象將發(fā)生改變,可以降低對(duì)象之間的耦合度。

3、一個(gè)對(duì)象必須通知其他對(duì)象,而并不知道這些對(duì)象是誰。需要在系統(tǒng)中創(chuàng)建一個(gè)觸發(fā)鏈,A對(duì)象的行為將影響B(tài)對(duì)象,B對(duì)象的行為將影響C對(duì)象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制。

參考:
大話設(shè)計(jì)模式》,作者程杰。
https://blog.csdn.net/jhq0113/article/details/46352145

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀察者模式 問題引入 一個(gè)系統(tǒng)在用戶登錄的時(shí)候,經(jīng)常要記錄一些東西:session、登錄次數(shù)、統(tǒng)計(jì)在線時(shí)長等;如果...
    PHP的藝術(shù)編程閱讀 386評(píng)論 0 1
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,095評(píng)論 1 15
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,086評(píng)論 3 14
  • 當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),依賴它的對(duì)象的狀態(tài)也會(huì)隨之改變。常用于業(yè)務(wù)解耦,一個(gè)事件發(fā)生時(shí),隨后通知一系列其他事件...
    henryspace閱讀 116評(píng)論 0 0
  • 這里是對(duì)《設(shè)計(jì)模式Java版》[https://gof.quanke.name]的提煉匯總,在真正深入理解之前,方...
    LeonXtp閱讀 1,169評(píng)論 0 0

友情鏈接更多精彩內(nèi)容