标签:color key 需要 解耦 alt article not obj 题目
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式的核心在于Subject和Observer接口,Subject(主题目标)包含一个给定的状态,观察者“订阅”这个主题,将主题的当前状态通知观察者,每次给定状态改变时所有观察者都会得到通知。
发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
在PHP的标准库(SPL)里甚至提供了三个接口SplSubject
, SplObserver
, SplObjectStorage
来让开发者更容易地实现观察者模式。
<?php class Subject implements SplSubject { private $observers = []; private $stateNow; /** * Attach an SplObserver * @param SplObserver $observer */ public function attach(SplObserver $observer) { // TODO: Implement attach() method. $this->observers[] = $observer; } /** * Detach an observer * @param SplObserver $observer */ public function detach(SplObserver $observer) { // TODO: Implement detach() method. $key = array_search($observer, $this->observers); if ($key !== false) { unset($this->observers[$key]); } } /** * Notify an observer */ public function notify() { // TODO: Implement notify() method. foreach ($this->observers as $observer) { $observer->update($this); } } public function setState($state) { $this->stateNow = $state; $this->notify(); } public function getState() { return $this->stateNow; } } class EmailObserver implements SplObserver { /** * Receive update from subject * @param SplSubject $subject */ public function update(SplSubject $subject) { // TODO: Implement update() method. echo $subject->getState() . ‘,发送邮件‘ . PHP_EOL; } } class SmsObserver implements SplObserver { /** * Receive update from subject * @param SplSubject $subject */ public function update(SplSubject $subject) { // TODO: Implement update() method. echo $subject->getState() . ‘,发送短信‘ . PHP_EOL; } } // run $emailObserver = new EmailObserver(); $smsObserver = new SmsObserver(); $subject = new Subject(); $subject->attach($emailObserver); $subject->attach($smsObserver); $subject->setState(‘用户修改密码‘);
参考:https://github.com/kevinyan815/Learning_Laravel_Kernel/blob/master/articles/Observer.md
标签:color key 需要 解耦 alt article not obj 题目
原文地址:https://www.cnblogs.com/cshaptx4869/p/11629715.html