APP开发项目中的PHP观察者设计模式

PHP观察者设计模式

做项目过程中经常会遇到一种情况,写一个登陆接口,写完后客户有新需求需要增加统计登陆次数,过段时间又需要统计登陆地区,又过几天又需要登陆推送活动或者新用户奖励,这种情况就容易让代码很杂乱,此时就可以用到观察者模式。

概念:观察者,首先要有个被人观察的角色,这是唯一的,然后有多个观察者去看他,可以形容为一群人在围观一个人,有多个观众就得有个东西来记录这些观众,这时候就需要一个数组来储存所有观察者,此时已经形成一个被观察者,多个观察者和一个容器记录组成的一个组合。

代码示例:

//主题接口

interface  Subject{
         public  function  register($observer);
         public  function  notify();
}

//观察者接口

interface  Observer{
         public  function watch();
}

Subject是被观察者,Observer是观察者

//被观察者

class  Action  implements  Subject{
           public  $_observers = array();
           public  function  register($observer){
                  $this->_observers[] = $observer;
           }
           public  function  notify(){
                  foreach($this->_observers  as  $observers){
    $observers->watch();
} 
           }
}

action 实现被观察者接口,他现在是被观察者,再定义一个$_observers数组,他就是存放观察者的容器。

首先实现register方法,用它传入一个观察者,然后塞到数组里,再实现notify()方法,他会遍历容器数组,执行每个观察者的watch()方法。
观察者

class  cat  implements  Observer{
      public  function  watch(){
             echo ‘cat  watches’;
      }
}

class  People  implements  Observer{
      public  function  watch(){
             echo ‘people’;
      }
}

这里定义了两个观察者,全都实现Observer接口,前面的Subject会循环调用每个观察者的watch方法,所以需要实现每个观察者的watch方法

应用实例

$action = new Action();
$action->register(new Cat());
$action->register(new People());
$action->notify();

首先new被观察者对象,执行它的register()方法,把每个观察者都放入容器数组,最后执行notify防范,通知所有观察者执行自己的方法。

PHP原生自带的观察者模式

splsubject 接口 - 被观察者
observer接口 - 观察者
SplObjectStorage对象 - 容器

首先需要一个用户登录类

class  user{
     public  function  login(){
         echo ‘login’;
     }
}

然后让他实现 splsubject 接口成为被观察者。

1.首先在构造函数里,让他new SplObjectStorage()对象并赋值到属性上方便后边调用
2.实现attach()方法,用来注册观察者
3.实现detach()方法,用来删除观察者
4.实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)
5.rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法获取当前的观察者,next方法是将指针后移以为
6.修改login()方法,在里边调用notify()来通知观察者事件完成

代码:

class  user  implements  splsubject{

      protected  $observer = null;

      public  function  __construct(){
           $this->observer = new SplObjectStorage();
      }

      public  function  login(){
          $this->notify();
          echo ‘login’;
      }

      public  function  attach($observer){
           $this->observer->attach($obserber);
      }

      public  function  detach($observer){
           $this->observer->detach($observer);
      }

      public  function  notify(){
           $this->observer->rewind();
           while($this->observer->valid()){
               $observer = $this->observer->current();
               $observer = update($this);
               $this->observer->next();
           }
      }
}

观察者

每个观察者实现SplObserver接口,并实现update() 方法

class  cat  implements  splobserver{
       public  function  update($subject){
              echo   ‘aaaa’;
}
}

class  People  implements  splobserver{
       public  function  update($subject){
              echo   ‘bbbb;
}
}

应用

//实时观察

$user = new user();
$user->attach(new cat());
$user->attach(new people());
$user->login();

关于PHP观察者设计模式的解释讲到这里也已经讲完了,这些是我们在实际的项目开发当中遇到问题以及解决方案,以后我们也会定期在这里分享这些内容;


如果你觉得笔者写的不错,并且具有APP开发、软件开发需求的话,也可以扫码添加好友,沟通你的想法!

咨询二维码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值