观察者模式(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');

发表评论 取消回复