php设计模式之观察者模式实例代码

Posted 毛毛 - 非科班的理科生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php设计模式之观察者模式实例代码相关的知识,希望对你有一定的参考价值。

php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SPLObserver,和一个可以储存对象的类SplObjectStorage。被观察者有三个方法,需要实现这三个方法,一个attach可以理解为添加一个观察者,detach可以理解为删除掉一个观察者,一个notify里面做循环执行被观察者的update方法(被观察者被存储在SplObjectStorage类里面),update方法把本类作为参数传进去。
 
<?php
header("Content-type:text/html;charset=utf-8");

/**
* 
*/
class Login implements SplSubject
{
    public $hobby;
    public $loginTimes;
    protected $observers = null;

    function __construct($hobby)
    {
        $this->hobby = $hobby;
        $this->loginTimes = rand(1,10);
        $this->observers = new SplObjectStorage();
    }

    public function login()
    {
        // login业务逻辑编写
        
        $this->notify();
    }

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

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


    public function notify()
    {
        // $this->observers->rewind();//将内部指针指向开始处
        // while ($this->observers->valid()) {
        //     $observer= $this->observers->current();//获取当前对象
        //     $observer->update($this);
        //     $this->observers->next();//将指针往下走一位
        // }
        foreach ($this->observers as $value) {
            $value->update($this);
        }
    }
}

//用户推送-观察者
class PushUser implements SplObserver
{
    public function update(SplSubject $subject)//传进来一个被观察者
    {
        //写自己的业务逻辑
        if ($subject->hobby == sport) {
            echo "推送运动产品<br>";
        }else{
            echo "推送热门产品<br>";
        }
    }
}

//安全信息推送-观察者
class PushSecurity implements SplObserver
{
    public function update(SplSubject $subject)//传进来一个被观察者
    {
        //写自己的业务逻辑
        if ($subject->loginTimes < 5) {
            echo "你今天第".$subject->loginTimes."次安全登录<br>";
        }else{
            echo "你今天第".$subject->loginTimes."次安全登录,出现异常登录<br>";
        }
    }
}

//新闻推送-观察者
class PushNews implements SplObserver
{
    public function update(SplSubject $subject)
    {
        //写自己的业务逻辑
        if ($subject->hobby == sport) {
            echo "推送运动新闻<br>";
        }else{
            echo "推送热门新闻<br>";
        }
    }
}


$user= new Login(sport);//创建一个实现了被观察者的接口类
$user->attach(new PushNews());//传进去一个实现了观察者的接口类
$user->attach(new PushUser());
$user->attach(new PushSecurity());
$user->login();

 

以上是关于php设计模式之观察者模式实例代码的主要内容,如果未能解决你的问题,请参考以下文章

PHP设计模式之----观察者模式

PHP 设计模式之观察者模式

设计模式之观察者模式--PHP

PHP模式设计之单例模式工厂模式注册树模式适配器模式观察者模式

《大话设计模式》——读后感 老板回来了,我不知道?——观察者模式之理论实例

2020PHP面试-PHP篇