zoukankan      html  css  js  c++  java
  • 【PHP】使用PHP原生自带的观察者模式

     

    整理自:https://www.cnblogs.com/itbsl/p/13407489.html

    搬运贴,如果有侵权请联系删除

    1. 需求背景

    • 实现登录功能

    • 添加登录次数统计

    • 添加登录区域判断

    • 添加登录后消息推送

    • 添加登录后…

    1. 使用PHP原生观察者模式实现 

    • splsubject接口 - 被观察者

    • Observer接口 - 观察者

    • SplObjectStorage对象 - 容器

    1. 用户登录类

    • 首先在构造函数里,让他new SplObjectStorag()对象并赋值到属性上方便后面调用

    • 实现attach()方法,用来注册观察者

    • 实现detach()方法,用来删除观察者

    • 实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)

    • rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法是获取当前的观察者,next方法是将指针后移一位

    • 修改login()方法,在里面调用notify()来通知观察者事件完成了

    class user implements splsubject{
    
        protected $observer = null;
    
        public function __construct()
        {
            $this->observer = new SplObjectStorage();
        }
    
        public function login()
        {
            $this->notify();
            echo '登录完毕';
        }
    
        public function attach(SplObserver $observer)
        {
            $this->observer->attach($observer);
        }
    
        public function detach(SplObserver $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();
            }
        }
    }
    

      

    1. 观察者

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

    class cat implements SplObserver {
    
        public function update(SplSubject $subject)
        {
            echo '小猫叫一下';
        }
    }
    class dog implements SplObserver {
        public function update(SplSubject $subject)
        {
            echo '小狗吼一声';
        }
    }
    

      

    1. 应用

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

      

    得意时做事,失意时读书
  • 相关阅读:
    代理模式
    组合模式
    策略模式
    状态模式
    js 未结束的字符串常量错误解决方法
    struts2+hibernate+poi导出Excel实例
    Java 实现导出excel表 POI
    ExtJS 4.2 中自定义事件
    dhtmlxGrid分页查询,条件查询实例
    '@P0' 附近有语法错误
  • 原文地址:https://www.cnblogs.com/lanse1993/p/14184689.html
Copyright © 2011-2022 走看看