码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2020-01-12 13:25:56      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:热门   异常   header   运动   指针   nts   添加   新闻   func   

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设计模式之观察者模式实例代码

标签:热门   异常   header   运动   指针   nts   添加   新闻   func   

原文地址:https://www.cnblogs.com/Mishell/p/12182197.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!