要实现对象的发布/订阅行为,只要[Subject]对象改变它的状态,就会通知附加的[observer]。它用于减轻对象的耦合度,并使用松耦合代替。
PHP已经定义了两个接口来帮助实现这个模式:SplObserver和SplSubject。
User.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralObserver; use SplSubject; use SplObjectStorage; use SplObserver; class User implements SplSubject { private SplObjectStorage $observers; private $email; public function __construct() { $this->observers = new SplObjectStorage(); } public function attach(SplObserver $observer): void { $this->observers->attach($observer); } public function detach(SplObserver $observer): void { $this->observers->detach($observer); } public function changeEmail(string $email): void { $this->email = $email; $this->notify(); } public function notify(): void { foreach ($this->observers as $observer) { $observer->update($this); } } }
UserObserver.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralObserver; use SplObserver; use SplSubject; class UserObserver implements SplObserver { private array $changedUsers = []; public function update(SplSubject $subject): void { $this->changedUsers[] = clone $subject; } public function getChangedUsers(): array { return $this->changedUsers; } }
Tests/ObserverTest.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralObserverTests; use DesignPatternsBehavioralObserverUser; use DesignPatternsBehavioralObserverUserObserver; use PHPUnitFrameworkTestCase; 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()); } }
目的使用类集合接口访问域对象,在域和数据映射层之间进行调解。存储库封装了持久化在数据存储中的一组对象以及对它们执行的操作...
什么是 UML?UML是 OMG 在1997年1月提出了创建由对象管理组和 UML1.0 规范草案;UML 是一种为面向对象开发系统的产品进行说明、...
手动测试是一种软件测试过程,需要手动执行测试用例而不是使用自动化工具。测试人员根据最终用户的角度手动执行所有测试用例。它...
测试计划是描述软件测试领域和活动的详细文档。它概述了测试策略,目标,测试计划,所需资源(人力资源,软件和硬件),测试评估和...
设计模式资源 本章列出了设计模式相关的网站、书籍和文章。 设计模式相关的网站 Wiki Page for Design Patterns - 以一种非常通...