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();
    

      

    得意时做事,失意时读书
  • 相关阅读:
    formValidator4.1.1问题汇总
    什么,又是字符串拼接,我有些不淡定了
    webform下的分页辅助类再总结
    winform下的一个分页控件总结
    总结SQL Server窗口函数的简单使用
    sql复制表定义及复制数据行
    动态SQL开发基础和经验再总结
    c#执行定时计算限制操作(计时器)
    ado.net关于操作数据库的连接字符串整理
    使用Visual Studio实现WinForm多语言版本实例
  • 原文地址:https://www.cnblogs.com/lanse1993/p/14184689.html
Copyright © 2011-2022 走看看