Bir nesneye, yayınım/katınım (publish/subscribe) davranışını uygulama için kullanılır. Bir modele crud vb işlemleri uygulandığında observer(gözlemciler)’a belirtilen işlemler yaptırılır. Örnek olarak yeni bir üyeniz olduğunda üye bilgilerini mail ile göndermek verilebilir.
Örneğe ait kodlar;
<?php // User.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; 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->notify(); } public function notify() { /** @var SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } } // UserObserver.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; } }
Test İşlemi şu şekilde olacaktır;
<?php //Tests/ObserverTest.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()); } }
İlk Yorumu Siz Yapın