?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

?和記娛h188下載app:什么是觀察者模式

?

Observer模式也叫察看者模式,是由GoF提出的23種軟件設計模式的一種。Observer模式是行徑模式之一,它的感化是當一個工具的狀態發生變更時,能夠自動看護其他關聯工具,自動刷新工具狀態。

察看者模式(Observer)完美的將察看者和被察看的工具分分開。舉個例子,用戶界面可以作為一個察看者,營業數據是被察看者,用戶界面察看營業數據的變更,發明數據變更后,就顯示在界面上。面向工具設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個工具只做一件工作,并且將他做好。察看者模式在模塊之間劃定了清晰的邊界,前進了利用法度榜樣的可掩護性和重用性。

察看者模式有很多實現要領,從根本上說,該模式必須包孕兩個角色:察看者和被察看工具。在剛才的例子中,營業數據是被察?和記娛h188下載app看工具,用戶界面是察看者。察看者和被察看者之間存在“察看”的邏輯關聯,當被察看者發生改變的時刻,察看者就會察看到這樣的變更,并且做出響應的相應。假如在用戶界面、營業數據之間應用這樣的察看歷程,可以確保界面和數據之間劃清邊界,假定利用法度榜樣的需求發生變更,必要改動界面?和記娛h188下載app的體現,只必要從新構建一個用戶界面,營業數據不必要發生變更。

“察看”不是“直接調用”

實現察看者模式的時刻要留意,察看者和被察看工具之間的互動關系不能表現成類之間的直接調用,否則就將使察看者和被察看工具之間慎密的耦合起來,從根本上違不和向工具的設計的原則。無論是察看者“察看”察看工具,照樣被察看者將自己的改變“看護”察看者,都不應該直接調用。

實現察看者模式的例子

實現察看者模式有很多形式,對照直不雅的?和記娛h188下載app一種是應用一種“注冊——看護——撤銷注冊”的形式。下面的三個圖具體的描述了這樣一種歷程:

1:察看者(Observer)將自己注冊到被察看工具(Subject)中,被察看工具將察看者寄放在一個容器(Container)里。

2:被察看工具發生了某種變更(如圖中的SomeChange),安閑器中獲得所有注冊過的察看者,將變更看護察看者。

3:察看者奉告被察看者要撤銷察看,被察看者安閑器中將察看者去除。

察看者將自己注冊到被察看者的容器中時,被察看者不應該干預干與察看者的詳細類型,而是應該應用察看者的接口。這樣的優點是:假定法度榜樣中還有其余察看者,那么只要這個察看者也是相同的接口實現即可。一個被察看者可以對應多個察看者,當被察看者發生變更的時刻,他可以將消息逐一看護給所有的察看者?;诮涌?,而不是詳細的實現——這一點為法度榜樣供給了更大年夜的機動性。

php代碼DEMO:

carName = $Name;

$this -> Observers = new SplObjectStorage;

}

//啟動

public function start ()

{

$this -> carState = 1;

$this -> notify();

}

//泊車

public function stop ()

{

$this -> carState = 0;

$this -> carSpeed = 0;

$this -> notify();

}

//加速

public function accelerate ($Acceleration)

{

if (0 === $this -> carState)

{

throw new Exception ('先踩油門,不然車怎走啊!!!');

}

if (!is_int ($Acceleration) || $AccelerationcarSpeed += $Acceleration;

$this -> notify();

}

//增添監測工具

public function ?和記娛h188下載appattach(SplObserver $observer)

{

if(!$this->Observers->contains($observer))

{

$this->Observers->attach($observer);

}

return true;

}

//刪除監測工具

public function detach(SplObserver $observer)

{

if(!$this->Observers->contains($observer))

{

return false;

}

$this->Observers->detach($observer);

return true;

}

//傳送工具

public function notify() {

foreach($this->Observers as $observer)

{

$observer->update($this);

}

}

public function __get ($Prop)

{

switch ($Prop) {

case 'STATE' :

return $this -> carState;

break;

case 'SPEED' :

return $this -> carSpeed;

break;

case 'NAME' :

return $this -> carName;

break;

default :

throw new Exception ($Prop.' cannot be read');

}

}

public function __set ($Prop, $Val)

{

throw new Exception ($Prop.' cannot be set');

}

}

class carStateObserver implements SplObserver

{

private $SubjectState;

public function update(SplSubject $subject)

{

switch ($subject -> STATE) {

case 0 :

if (is_null ($this -> SubjectState))

{

echo $subject -> NAME.' 沒有啟動呢'."trn";

} else {

echo $subject -> NAME.' 熄火了'."trn";

}

$this -> SubjectState = 0;

break;

case 1:

if (1 !== $this -> SubjectState)

{

echo $subject -> NAME.' 啟動了'."trn";

$this -> SubjectState = 1;

}

break;

default :

throw new Exception ('Unexpected error in carStateObserver::update()');

}

}

}

class carSpeedObserver implements SplObserver

{

public function update(SplSubject $subject)

{

if (0 !== $subjec?和記娛h188下載appt -> STATE) {

echo $subject -> NAME.' 今朝速率為 '.$subject -> SPEED.'Kmh '."trn";

}

}

}

class carOverspeedObserver implements SplObserver

{

public function update(SplSubject $subject)

{

if ($subject -> SPEED > 130)

{

throw new Exception ('加速限定在130以內, 你違規了!'."trn");

}

}

}

try

{

$driver = new car ('AUDI A4');

$driverObserver1 = new carStateObserver;

$driverObserver2 = new carSpeedObserver;

$drivesrObserver3 = new carOverspeedObserver;

$driver -> attach($driverObserver1);

$driver -> attach($driverObserver2);

$driver -> attach($drivesrObserver3);

$driver -> start();

$driver -> accelerate(10);

$driver -> accelerate(30);

$driver -> stop();

$driver -> start();

$driver -> accelerate(50);

$driver -> accelerate(70);

$driver -> accelerate(100);

$driver -> accelerate(150);

}

catch (Exception $e)

{

echo $e -> getMessage ();

}

?>

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户