摘要:观察者模式又称为发布订阅模式,属于行为型模式的一种,它是将行为独立模块化,降低了行为和主体的耦合性。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
观察者模式(又称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它是将行为独立模块化,降低了行为和主体的耦合性。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
PHP 内置了
SplSubject 抽象主题 Interface
SplObserver 抽象观察者 Interface
接口约束
// 主题 被观察者
interface SplSubject {
public function attach(SplObserver $observer); //注册观察者到当前主题
public function detach(SplObserver $observer); //从当前主题删除观察者
public function notify(); //主题状态更新时通知所有的观察者做相应的处理
}
// 观察者
interface SplObserver {
public function update(SplSubject $subject); //注册观察者到当前主题
}
通过项目中的实际应用能更容易的去理解观察者模式
下面我们以用户为主题,邮件模块和短信模块为观察者
当用户注册成功时,邮件观察者或短信观察者则收到相应的通知,发送邮件和短信给用户
User 主题
name = $name;
$this->email = $email;
$this->mobile = $mobile;
//business handle and register success
$reg_result = true;
if ($reg_result) {
$this->notify(); // 注册成功 所有的观察者将会收到此主题的通知
return true;
}
return false;
}
/**
* 当前主题注册新的观察者
* @param SplObserver $observer [description]
* @return [type] [description]
*/
public function attach(SplObserver $observer)
{
return array_push($this->observers, $observer);
}
/**
* 当前主题删除已注册的观察者
* @param SplObserver $observer [description]
* @return [type] [description]
*/
public function detach(SplObserver $observer)
{
$key = array_search($observer, $this->observers, true);
if (false !== $key) {
unset($this->observers[$key]);
return true;
}
return false;
}
/**
* 状态更新 通知所有的观察者
* @return [type] [description]
*/
public function notify()
{
if (! empty($this->observers)) {
foreach ($this->observers as $key => $observer) {
$observer->update($this);
}
}
return true;
}
}
Email/Sms 观察者
/**
* 观察者通过 update 来接受主题的更新通知
*/
class EmailObserver implements SplObserver
{
/**
* 观察者接收主题通知的接口
* @param SplSubject $user [description]
* @return [type] [description]
*/
public function update(SplSubject $user)
{
echo "send email to " . $user->email . PHP_EOL;
}
}
class SmsObserver implements SplObserver
{
public function update(SplSubject $user)
{
echo "send sms to " . $user->mobile . PHP_EOL;
}
}
业务
// User 主题
$user = new User();
// 为 user 注册 Email 观察者 (Email 观察者订阅 User 主题)
$emailObserver = new EmailObserver();
$user->attach($emailObserver);
// 为 user 注册 Sms 观察者 (Sms 观察者订阅 User 主题)
$smsObserver = new SmsObserver();
$user->attach($smsObserver);
// 从 user 上删除 Sms 观察者 (Sms 观察者取消订阅 User 主题)
//$user->detach($smsObserver);
// register 中会根据注册结果通知观察者 观察者做相应的处理
$user->register("big cat", "32448732@qq.com", "1888888888");
结果
send email to 32448732@qq.com send sms to 1888888888 [Finished in 0.1s]
其实观察者模式类似于事件注册和钩子回调,日常开发中我们可能重构分离出一部分类的行为到外部,封装成独立的功能模块,在注册到类中,可以使用事件注册,也可以使用观察者模式
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25576.html
摘要:概念观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。观察者模式符合接口隔离原则,实现了对象之间的松散耦合。 概念 观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 当一个对象状态发生改变后,会影响到其他几个对象的改变,这...
摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...
摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...
摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...
摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...
阅读 2930·2021-10-22 09:55
阅读 2532·2021-09-27 13:35
阅读 1538·2021-08-24 10:02
阅读 1843·2019-08-30 15:55
阅读 1459·2019-08-30 14:13
阅读 3711·2019-08-30 13:57
阅读 2235·2019-08-30 11:07
阅读 2707·2019-08-29 17:12