ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

观察者模式代码实现

2021-11-24 18:02:53  阅读:147  来源: 互联网

标签:function observer 代码 观察者 模式 observers public subject


观察者模式是什么?

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己 应用场景:   当一个对象的改变需要同事改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。   观察者模式所作的工作其实就是在接触耦合。让耦合的双方都依赖于抽象类,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化 举个例子:   用户登录判断,记录用户是否非法登录次数过多;并根据登录的身份,显示不同的广告位。               流程图如下:                   上代码:
#观察者模式
## PHP5 提供观察者 observer 与 被观察者 subject 的接口
class User implements SplSubject {
    public $lognum;//登录次数
    public $hobby; // 爱好
    protected $observers = null; // 存储对象

    /**
     * 登录初始化赋值
     * user constructor.
     * @param $hobby
     */
    public function __construct($hobby)
    {
        $this->lognum = rand(1,10);
        $this->hobby = $hobby;
        $this->observers = new SplObjectStorage();//储存对象的类
    }

    /**
     * 观察登录次数,触发 广告 和 商务 类,处理相关逻辑
     */
    public function login(){
        // 操作session
        // 登录就触发通知观察者
        $this->notify();
    }
    /**
     * 添加被观察者类
     * @param SPLObserver $observer
     */
    public function attach(SPLObserver $observer){
        $this->observers->attach($observer);
    }

    /**
     * 删除被观察者
     * @param SplObserver $observer
     */
    public function detach(SplObserver $observer){
        $this->observers->detach($observer);
    }

    /**
     *  通知被观察者
     */
    public function notify()
    {
        // TODO: Implement notify() method.
        $this->observers->rewind();
        while($this->observers->valid()){
            $observer = $this->observers->current();
            $observer->update($this);// 通知自己
            $this->observers->next();
        }
    }
}

#观察者类 安全
class Secrity implements SPLObserver {
    public function update(SplSubject $subject){
        if( $subject->lognum < 3 ){
            echo '这是第'. $subject->lognum.'次安全登录';
        }else{
            echo '这是第'. $subject->lognum.'次登录,异常';
        }
    }
}
#观察者类 广告
class Ad implements SplObserver {
    public function update(SplSubject $subject){
        if( $subject->hobby == 'sports' ) {
            echo '台球英锦赛门票预订';
        }else{
            echo '好好学习,天天向上';
        }
    }
}

// 实现观察
$user = new User('sports');
$user->attach(new Secrity());
$user->attach(new Ad());
$user->login();

  

标签:function,observer,代码,观察者,模式,observers,public,subject
来源: https://www.cnblogs.com/leijiangsheng/p/15599272.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有