php 设计模式——观察者模式


前言

第一篇php博客,聊一下php设计模式之观察者模式


一、什么是设计模式?

每一个设计模式描述的都是在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
每一个模式都有他本身的有点和缺点,根据问题的不同选择出适合的模式去使用,这样,我们就能一次又一次地根据
使用场景不同使用二使用方案,并且不必做重复劳动

二、进入正题

什么是观察者模式?

观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新!

所有的观察者(observer)全部被注册(register函数)进入数组(事件的_observers[]数组),这样,当事件
有变化的时候,就能通过遍历来通知所有的观察者

代码部分

<?php
 /**
  * 观察者模式
  */
  
  
 class Paper{ /* 主题    */
     private $_observers = array();
  
     public function register($sub){ /*  注册观察者 */
         $this->_observers[] = $sub;
     }
  
      
     public function trigger(){  /*  外部统一访问    */
         if(!empty($this->_observers)){
             foreach($this->_observers as $observer){
                 $observer->update();
             }
         }
     }
 }
  
 /**
  * 观察者要实现的接口
  */
 interface Observerable{
     public function update();
 }
  
 class Subscriber implements Observerable{
     public function update(){
         echo "Callback\n";
     }
 }

2.测试

代码如下(示例):

 /*  测试    */
 $paper = new Paper();
 $paper->register(new Subscriber());
 //$paper->register(new Subscriber1());
 //$paper->register(new Subscriber2())
 $paper->trigger();

该处使用的url网络请求的数据。


总结

/**
*当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框
架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。
*/

设计模式虽好,但需要我们不断的去理解和实践,有能力的可以思考自己的设计理念,并去实践

三、额外的内容

/**
  * 事件产生类
  * Class EventGenerator
  */
 abstract class EventGenerator
 {
     private $ObServers = [];
 
     //增加观察者
     public function add(ObServer $ObServer)
     {
         $this->ObServers[] = $ObServer;
     }
 
     //事件通知
     public function notify()
     {
         foreach ($this->ObServers as $ObServer) {
             $ObServer->update();
         }
     }
 
 }
 
 /**
  * 观察者接口类
 * Interface ObServer
  */
 interface ObServer
 {
     public function update($event_info = null);
 }
 
 /**
 * 观察者1
  */
 class ObServer1 implements ObServer
 {
     public function update($event_info = null)
     {
         echo "观察者1 收到执行通知 执行完毕!\n";
     }
 }
 
 /**
  * 观察者1
  */
 class ObServer2 implements ObServer
 {
     public function update($event_info = null)
     {
         echo "观察者2 收到执行通知 执行完毕!\n";
     }
 }
 
 /**
  * 事件
  * Class Event
  */
 class Event extends EventGenerator
 {
     /**
      * 触发事件
      */
     public function trigger()
     {
         //通知观察者
         $this->notify();
     }
 }
 
 //创建一个事件
 $event = new Event();
 //为事件增加旁观者
 $event->add(new ObServer1());
 $event->add(new ObServer2());
 //执行事件 通知旁观者
 $event->trigger();
	最后说明一下今天为什么写这篇文章,目前我在做微信小程序,碰到了一个关于弹窗图片和模态弹窗的执行先后
问题,按普通的代码执行顺序的方法行不通,后来请教了一个大佬,说了解一下发布订阅模式,网上找了些资料看了
看,感觉非常有用,搞定后有找了些php的一些类似发布订阅的观察者模式学习了一下,放到这里,大家可以学习一下

部分转载至范仁义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值