您好,欢迎访问一九零五行业门户网

PHP 设计模式系列 -- 观察者模式(Observer)

1、模式定义 观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
消息队列系统、事件都使用了观察者模式。
php 为观察者模式定义了两个接口:splsubject 和splobserver。splsubject 可以看做主体对象的抽象,splobserver 可以看做观察者对象的抽象,要实现观察者模式,只需让主体对象实现 splsubject ,观察者对象实现 splobserver,并实现相应方法即可。
2、uml类图
3、示例代码 user.php
observers = new \splobjectstorage(); } /** * 附加观察者 * * @param \splobserver $observer * * @return void */ public function attach(\splobserver $observer) { $this->observers->attach($observer); } /** * 取消观察者 * * @param \splobserver $observer * * @return void */ public function detach(\splobserver $observer) { $this->observers->detach($observer); } /** * 通知观察者方法 * * @return void */ public function notify() { /** @var \splobserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } /** * * @param string $name * @param mixed $value * * @return void */ public function __set($name, $value) { $this->data[$name] = $value; // 通知观察者用户被改变 $this->notify(); }}
userobserver.php
expectoutputstring('designpatterns\behavioral\observer\user has been updated'); $subject = new user(); $subject->attach($this->observer); $subject->property = 123; } /** * 测试订阅 */ public function testattachdetach() { $subject = new user(); $reflection = new \reflectionproperty($subject, 'observers'); $reflection->setaccessible(true); /** @var \splobjectstorage $observers */ $observers = $reflection->getvalue($subject); $this->assertinstanceof('splobjectstorage', $observers); $this->assertfalse($observers->contains($this->observer)); $subject->attach($this->observer); $this->asserttrue($observers->contains($this->observer)); $subject->detach($this->observer); $this->assertfalse($observers->contains($this->observer)); } /** * 测试 update() 调用 */ public function testupdatecalling() { $subject = new user(); $observer = $this->getmock('splobserver'); $subject->attach($observer); $observer->expects($this->once()) ->method('update') ->with($subject); $subject->notify(); }}
5、总结 观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
其它类似信息

推荐信息