快捷搜索:  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 ();

}

?>

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: