



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第PHP设计模式中观察者模式讲解目录简介适用场景优点缺点补充代码(自定义实现)代码(基于SPL实现)
简介
观察者模式是行为型模式的一种,定义了对象间一对多的关系。当对象的状态发生变化时候,依赖于它的对象会得到通知。
适用场景
类似触发钩子事件,可做消息通知、框架底层监听。一个对象的改变会导致一个或多个对象发生改变,方便扩展的写法。
优点
方便扩展,降低耦合,统一触发规则。当需要新增或者删除一个观察者的时候,只需要增加观察者就行。
缺点
相比于不用观察者而是直接依赖某些类,增加代码的复杂度。如果观察者者被观察者互相依赖,有产生死循环的可能。
补充
需要理清楚观察者和被观察者是谁,观察者可以理解为被动受到通知的对象。被观察者是主动发送通知的对象。固定的套路,被观察者至少需要一个添加观察者的方法和一个通知观察者的方法用来确定身份和发送通知(一般有三个,多一个删除观察者的方法),观察者至少需要一个更新的方法用于接收被观察者的通知。
代码(自定义实现)
//假设用户成功购买商品后需要发送邮件和短信通知
classOrder{
private$observers=[];
//添加观察者
publicfunctionattach($type,$observer){
$this-observers[$type]=$observer;
//对每个观察者进行通知
publicfunctionnotify(){
if($this-observers==[]){
returnnull;
foreach($this-observersas$every_observer){
(new$every_observer)-update($this);
//购买商品,触发通知
publicfunctionbuyGoods(){
//todo订单操作
echo'商品购买完成'.PHP_EOL;
$this-notify();
classMail{
publicfunctionupdate($observer){
echo'发送电子邮件'.PHP_EOL;
classSms{
publicfunctionupdate($observer){
echo'发送短信'.PHP_EOL;
$order=newOrder();
//添加观察者
$order-attach('mail',Mail::class);
$order-attach('sms',Sms::class);
$order-buyGoods();
代码(基于SPL实现)
SPL(StandardPHPLibrary)标准PHP类库,用于解决典型问题的一组接口与类的集合。
classOrderListenerimplements\SplSubject{
//观察者列表
public$observers;
publicfunction__construct(){
//SplObjectStorage类提供从对象到数据的映射,或者通过忽略数据,提供对象集的映射。在许多需要唯一标识对象的情况下,这种双重用途非常有用。
$this-observers=new\SplObjectStorage();
//添加要通知的对象
publicfunctionattach(\SplObserver$observer){
$this-observers-attach($observer);
//移除要通知的对象
publicfunctiondetach(\SplObserver$observer){
$this-observers-detach($observer);
//通知
publicfunctionnotify(){
//将迭代器(此处可以理解为指针)倒回到第一个存储元素。
$this-observers-rewind();
//判断指针是否有效
while($this-observers-valid()){
//获取当前的观察者
$curr_obj=$this-observers-current();
//对当前观察者进行通知
$curr_obj-update($this);
//向下移动指针
$this-observers-next();
//触发通知
publicfunctionbuyGoods(){
echo'购买成功'.PHP_EOL;
$this-notify();
//SplObserver接口与SplSubject接口一起使用,以实现观察者设计模式。
classMailimplements\SplObserver{
//对被观察的对象做相应的处理
publicfunctionupdate(\SplSubject$subject){
echo'发送邮件'.PHP_EOL;
classSmsimplements\SplObserver{
//对被观察的对象做相应的处理
publicfunctionupdate(\SplSubject$subject){
echo'发送短信'.PHP_EOL;
$listener=newOrderListener();
//添加观察者
$listener-attach(newMail());
$listener-attach(newSms());
$listener-buyGoods();
通知代码(基于SPL实现的notify方法优化)
//以上代码的notify方法使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年内蒙古通辽市科左中旗舍伯吐镇中心小学数学三上期末学业水平测试试题含解析
- 主管护师考试的备考资料试题及答案
- 全科目复习主管护师考试试题及答案
- 专病管理执业医师考试试题及答案
- 2025年执业医师考试成就分享经验试题及答案
- 2025年卫生资格考试知识网络试题与答案
- 自考行政管理2025年考试安排与试题及答案
- 深入理解经济法试题及答案解析
- 中国文化概论中的生态意识试题及答案
- 常见失误总结与对策2025年执业医师考试试题及答案
- CB/T 3766-1996排气管钢法兰及垫片
- 屋顶花园(绿化)课件
- 血透患者常用药物
- 登临诗 诗歌赏析
- 深圳经济特区行业协会章程示范文本
- 免修申请表(模板)
- 工作面安全生产条件验收表
- 门诊病历书写规范PPT
- 2022版《语文课程标准》
- DB13(J)∕T 8057-2019 市政排水管渠工程施工质量验收标准
- 最新中山市中小学校情况一览表
评论
0/150
提交评论