观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
观察者模式实现了低耦合,非侵入式的通知与更新机制
/** * PHP内置 SplObserver[观察者] SplSubject[被观察者] SplObjectStorage[存放观察者的类] */ /** * 被观察者 */ class Articel implements SplSubject { private $storage; const POST_STATUS_SUCCESS = 1; const POST_STATUS_ERROR = 2; function __construct() { $this->storage = new SplObjectStorage(); } /** * 添加观察者 * @param SplObserver $observer */ function attach(SplObserver $observer) { $this->storage->attach($observer); } /** * 移除观察者 * @param SplObserver $observer */ function detach(SplObserver $observer) { $this->storage->detach($observer); } /** * 通知观察者 执行更新 */ function notify() { foreach ($this->storage as $obs) { $obs->update($this); } } /** * 被观察者执行任务[并执行通知操作] * @param type $content */ function postArticle($content = '') { if (empty($content)) { echo "POST ERROR!!!"; } else { echo "POST SUCCESS!!!"; } $this->notify(); } } /** * 观察者抽象类 */ abstract class ArticleObserver implements SplObserver { private $article; /** * 传入被观察者,并执行被观察者的添加观察者方法 * @param Articel $article */ function __construct(Articel $article) { $this->article = $article; $article->attach($this); } /** * 实现更新方法,并指向真正执行更新的方法 * @param SplSubject $subject */ function update(SplSubject $subject) { if ($subject === $this->article) { $this->doUpdate($subject); } } /** * 抽象方法 由子类实现 */ abstract function doUpdate(Articel $article); } /** * 邮件观察者 */ class ArticleEmail extends ArticleObserver { function doUpdate(Articel $article) { //发送邮件的实现 print __class__ . ".\t post article success \n"; } } /** * 短信观察者 */ class ArticleSms extends ArticleObserver { function doUpdate(Articel $article) { //发送邮件的实现 print __class__ . ".\t post article success \n"; } } //创建被观察者 $article = new Articel(); //添加观察者 new ArticleEmail($article); //添加观察者 new ArticleSms($article); //被观察者执行任务 $article->postArticle('1231234');
发表评论 取消回复