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

 

posted @ 2020-01-12 11:30  A毛毛  阅读(470)  评论(0编辑  收藏  举报