PHP設計模式之觀察者模式

2021-10-07 04:23:30 字數 3684 閱讀 7889

首先觀察者模式,顧名思義,就是需要有乙個觀察者和被觀察者,被觀察的物件發生了變化,可以及時通知所有觀察這個物件變化的物件

在php種預定義的觀察者:\splobserver觀察者定義了乙個介面:

inte***ce

splobserver

在php種預定義的被觀察者:\splsubject,這個被觀察者定義了三個介面方法

inte***ce

splsubject

很明顯,在觀察者方法裡,如果有變化了就呼叫update()方法; 在被觀察裡,第乙個方法attach(),新增乙個被觀察者到乙個自己維護的資料結構中,

這個結構可以是php的陣列array, 可以是乙個集合,可以是乙個has表,具體的怎麼實現,都可以自己操作。detach()這個方法就是從之維護的乙個結

構中,刪掉這個被觀察者。最後乙個核心的方法就是notfiy,它是從之前的資料儲存結構中,遍歷所有的觀察者,呼叫觀察者裡的方法,通知它需要做事情了。

之前第四步說的儲存註冊觀察者的資料結構,可以是乙個陣列,可以是乙個集合,同時還可以是php自己實現的乙個\splobjectstorage的乙個管理類

splobjectstorage 在裡面它實現了很多方法,包括但不限於attach(), detach()

是乙個很強大的類,可以幫我們做這些事情。如下:

class

splobjectstorage

implements

\countable

, \iterator

, \serializable

, \arrayaccess

public

function detach (

$object

)public

function contains (

$object

)public

function addall (

$storage

)public

function removeall (

$storage

)public

function removeallexcept (

$storage

)public

function getinfo (

)public

function setinfo (

$data

)/**

* @inheritdoc

*/public

function

current()

/** * @inheritdoc

*/public

function

next()

/** * @inheritdoc

*/public

function

key(

)/**

* @inheritdoc

*/public

function

valid()

/** * @inheritdoc

*/public

function

rewind()

/** * @inheritdoc

*/public

function

offsetexists

($offset

)/**

* @inheritdoc

*/public

function

offsetget

($offset

)/**

* @inheritdoc

*/public

function

offsetset

($offset

,$value

)/**

* @inheritdoc

*/public

function

offsetunset

($offset

)/**

* @inheritdoc

*/public

function

serialize()

/** * @inheritdoc

*/public

function

unserialize

($serialized

)/**

* @inheritdoc

*/public

function

count()

}

現在建立乙個被觀察者**平台

class

weather

implements

\splsubject

public

function

setemail

($email

)public

function

getemail()

/** * @inheritdoc 註冊觀察者

*/public

function

attach

(splobserver $observer

)/**

* @inheritdoc 登出觀察者

*/public

function

detach

(splobserver $observer

)// 天氣改變後,通知所有的觀察者

public

function

changeweather

(string $email

)/**

* @inheritdoc 通知所有的觀察者

*/public

function

notify()

}}

建立四個觀察者

}客戶端測試呼叫

class

client

}new

client

('今天的天氣溫度是 36.6攝氏度,注意高溫防曬');

newclient

('今天的天氣溫度是 40.0攝氏度,注意高溫防曬');

newclient

('今天的天氣溫度是 22.0攝氏度,溫度剛剛好'

);

當我們天氣變化的時候,就直接呼叫changeweather()方法,這樣四家**平台就都得到最新的天氣情況了

php設計模式之 觀察者模式

觀察者模式 observer 當乙個物件狀態發生改變時,依賴它的物件全部收到通知,並自動更新。抽象被觀察者 abstract class eventgenerator 通知所有觀察者 public function notify 具體被觀察者class event extends eventgene...

PHP 設計模式之觀察者模式

介紹現在有兩派,有的人建議使用設計模式,有的人不建議使用設計模式!這就向寫文章一樣,有的人喜歡文章按照套路走,比如敘事性質的文章,時間,地點,人物,事件。而有的人喜歡寫雜文或者散文,有的人喜歡寫詩詞!很多時候,我看設計模式的時候,有些設計模式只是吻合我的 習慣。但是你硬去套它,那麼反而適得其反。很多...

php 設計模式之觀察者模式

觀察者模式 1.抽象事件發生類 abstract class eventgenerator 對 所有 觀察者 進行 事件 通知 function notify 2.宣告具體事件類 class event extends eventgenerator 3.宣告 乙個 觀察者 介面 inte ce ob...