W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
要實(shí)現(xiàn)對象的發(fā)布/訂閱行為,只要[Subject]對象改變它的狀態(tài),就會(huì)通知附加的[observer]。它用于減輕對象的耦合度,并使用松耦合代替。
PHP已經(jīng)定義了兩個(gè)接口來幫助實(shí)現(xiàn)這個(gè)模式:SplObserver和SplSubject。
User.php
<?php declare(strict_types=1); namespace DesignPatterns\Behavioral\Observer; use SplSubject; use SplObjectStorage; use SplObserver; /** * User implements the observed object (called Subject), it maintains a list of observers and sends notifications to * them in case changes are made on the User object */ 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 { /** @var SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } }
UserObserver.php
<?php declare(strict_types=1); namespace DesignPatterns\Behavioral\Observer; use SplObserver; use SplSubject; class UserObserver implements SplObserver { /** * @var SplSubject[] */ private array $changedUsers = []; /** * It is called by the Subject, usually by SplSubject::notify() */ public function update(SplSubject $subject): void { $this->changedUsers[] = clone $subject; } /** * @return SplSubject[] */ public function getChangedUsers(): array { return $this->changedUsers; } }
Tests/ObserverTest.php
<?php declare(strict_types=1); 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()); } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: