观察者模式php,观察者模式(Observer)

3.7.1. 目的

当对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。它使用的是低耦合的方式。

3.7.2. 例子

使用观察者模式观察消息队列在 GUI 中的运行情况。

3.7.3. 注意

PHP 已经定义了2个接口用于快速实现观察者模式:SplObserver 和 SplSubject。

3.7.4. UML 图

dcc8475fcdb212e2153c11c728841184.png

3.7.5. 代码

你可以在  GitHub 查看这段代码。

User.php

namespace DesignPatterns\Behavioral\Observer;

/**

* User 实现观察者模式 (称为主体),它维护一个观察者列表,

* 当对象发生变化时通知 User。

*/

class User implements \SplSubject

{

/**

* @var string

*/

private $email;

/**

* @var \SplObjectStorage

*/

private $observers;

public function __construct()

{

$this->observers = new \SplObjectStorage();

}

public function attach(\SplObserver $observer)

{

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

}

public function detach(\SplObserver $observer)

{

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

}

public function changeEmail(string $email)

{

$this->email = $email;

$this->notify();

}

public function notify()

{

/** @var \SplObserver $observer */

foreach ($this->observers as $observer) {

$observer->update($this);

}

}

}

UserObserver.php

namespace DesignPatterns\Behavioral\Observer;

class UserObserver implements \SplObserver

{

/**

* @var User[]

*/

private $changedUsers = [];

/**

* 它通常使用 SplSubject::notify() 通知主体

*

* @param \SplSubject $subject

*/

public function update(\SplSubject $subject)

{

$this->changedUsers[] = clone $subject;

}

/**

* @return User[]

*/

public function getChangedUsers(): array

{

return $this->changedUsers;

}

}

3.7.6. 测试

Tests/ObserverTest.php

namespace DesignPatterns\Behavioral\Observer\Tests;

use DesignPatterns\Behavioral\Observer\User;

use DesignPatterns\Behavioral\Observer\UserObserver;

use PHPUnit\Framework\TestCase;

class ObserverTest extends TestCase

{

public function testChangeInUserLeadsToUserObserverBeingNotified()

{

$observer = new UserObserver();

$user = new User();

$user->attach($observer);

$user->changeEmail('foo@bar.com');

$this->assertCount(1, $observer->getChangedUsers());

}

}

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接

我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值