PHP观察者模式实例分析【对比JS观察者模式】

时间:2022-07-27
本文章向大家介绍PHP观察者模式实例分析【对比JS观察者模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文实例讲述了PHP观察者模式。分享给大家供大家参考,具体如下:

1.用js实现观察者模式

<!DOCTYPE html 
<html 
<head 
    <title </title 
    <style type="text/css" 
    div{width: 100px;height: 100px;border: 1px #999 solid;margin-bottom: 5px;}
    </style 
</head 
<body 
<!--
我们让div对象观察select的变化,selecte变化就会通知这个2个对象,并引起这2个对象的变化,实现观察者模式。
 -- 
 <h1 用观察者模式切换页面风格</h1 
 <select 
     <option value="male" 男式风格</option 
     <option value="female" 女士风格</option 
 </select 
 <button onclick="t1()" 观察学习区</button 
 <button onclick="t2()" 不观察学习区</button 
 <div id="content" 我是内容</div 
 <div id="ad" 我是广告</div 
 <div id="study" 学习</div 
</body 
<script type="text/javascript" 
    var sel = document.getElementsByTagName('select')[0];
    sel.observers = {};
    sel.attach = function(key,obj){
        this.observers[key] = obj;
    }
    sel.detach = function(key){
        delete this.observers[key];
    }
    sel.onchange = sel.notify = function(){
        for(var key in this.observers){
            this.observers[key].update(this);
        }
    }
    //客户端
    var content = document.getElementById('content');
    var ad = document.getElementById('ad');
    content.update = function(ob){
        if (ob.value == 'male') {
            this.style.backgroundColor = 'gray';
        }else if(ob.value == 'female'){
            this.style.backgroundColor = 'pink';
        }
    }
    ad.update = function(ob){
        if (ob.value == 'male') {
            this.innerHTML = '汽车';
        }else if(ob.value == 'female'){
            this.innerHTML = '减肥';
        }
    }
    //让content观察select的变化
    sel.attach('content',content);
    sel.attach('ad',ad);
    //新增监听study区
    var study = document.getElementById('study');
    study.update = function(ob){
        if (ob.value == 'male') {
            this.innerHTML = '学习计算机';
        }else if(ob.value == 'female'){
            this.innerHTML = '学习美容';
        }
    }
    sel.attach('study',study);
    function t1(){
        sel.attach('study',study);
    }
    function t2(){
        sel.detach('study');
    }
</script 
</html 

2.用php实现观察模式

<?php
//php实现观察者
//php5中提供观察者observer和被观察者subject的接口
class User implements SplSubject
{
    public $lognum;
    public $hobby;
    protected $observers = null;
    public function __construct($hobby)
    {
        $this- lognum = rand(1,10);
        $this- hobby = $hobby;
        $this- observers = new SplObjectStorage();
    }
    public function login()
    {
        //操作session等
        $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();
        }
    }
}
//用户安全登录模块
class Safe implements SPLObserver
{
    public function update(SplSubject $subject)
    {
        if ($subject- lognum < 3) {
            echo '这是第' . $subject- lognum . '次安全登录<br ';
        }else{
            echo '这是第' . $subject- lognum . '次登录,异常<br ';
        }
    }
}
//广告模块
class Ad implements SPLObserver
{
    public function update(SplSubject $subject)
    {
        if ($subject- hobby == 'sports') {
            echo '英超开始啦<br ';
        }else{
            echo '好好学习<br ';
        }
    }
}
//实施观察
// $user = new User('sports');
$user = new User('study');
$user- attach(new Safe());
$user- attach(new Ad());
$user- login();//登录