新浦京81707con > 软件下载 > PHP面向对象之观察者模式,观察者模式

原标题:PHP面向对象之观察者模式,观察者模式

浏览次数:73 时间:2019-05-06

    观望者形式按小编的的驾驭,首要分为观望者类和被被旁观者类2个部分。被观看者类会承接贰个接口(如:Observable)完毕对旁观者的增进、删除和公告(即文告观望者爆发了一定事件),它聚合了观望者类具体看原书类图。而观望者类承继3个接口(如:Observer)完结3个虚无方法update(),以下代码示例中此办法还将吸纳二个参数即被观望者,依据被观看者的动静来支配是不是实施自身的事情逻辑。好了闲谈不多说从来上代码。

复制代码 代码如下:

//被观看者类
interface Observable {
    function attach(Observer $observer);    //增添观望者
    function detach(Observer $observer);    //删除阅览者
    function notify();              //布告旁观者
}

<?php
/**
* 观望者情势
*
* 定义对象间的1种1对多的借助关系,以便当3个目的的情事爆发改换时,全数信赖于它的指标都收获照料并机关刷新
* 能够有利于地开创查看指标对象景况的指标,并且提供与主导指标非耦合的内定效率
* 插件系统
*/
class Observerable
{
private $_observers = array();

//四个管理登录新闻的类
class Login implements Observable{
    const LOGIN_USER_UNKNOWN =1;
    const LOGIN_WRONG_PASS =2;
    const LOGIN_ACCESS =3;
    private $status = array();  //阅览者的情事
    
    private $observers;  //保存观望者对象
    
    function __construct (){
        $this->observers = array();
    }
    
    function attach(Observer $observer){
        $this->observers[] = $observer;
    }
    
    function detach(Observer $observer){
        $newobservers = array();
        foreach(|$this->observers as $obs){
            if($obs !== $observer){
                $newobservers[]=$obs;
            }
        }
        $this->observers = $newobservers;
    }
    
    function notify(){
        foreach($this->observers as $obs){
            $obs->update($this);
        }
    }
    
    function handleLogin($user,$pass,$ip){
        switch(rand(1,3)){                  //这里模拟了三种登入状态
            case 1:
                $this->setStatus(self::LOGIN_ACCESS,$user,$ip);  //设置被旁观者的图景,通告阅览者后,观望者将跟据状态来施行相应的专业逻辑
                $ret =true;
                break;
            case 2:
                $this->setStatus(self::LOGIN_WRONG_PASS,$user,$ip);
                $ret =false;
                break;
            case 3:
                $this->setStatus(self::LOGIN_USER_UNKNOWN,$user,$ip);
                $ret =false;
                break;
        }        
        $this->notify():
        return $ret;
        //...............
    }
    
    private function setStatus($status,$user,$ip){
        $this->status = array($status,$user,$ip)
    }
}

public function registerObserver($observer)
{
$this->_observers[] = $observer;
}

//旁观者类
interface Observer{
    function update(Observable $observable);
}

public function removeObserver($observer)
{
$key = array_search($observer,$this->_observers);
if(!($key === false))
{
unset($this->_observers[$key]);
}
}

//这一个类主假如为了保障传递过来的被观望者对象是login类,因为唯有login才有setStatus方法,上边包车型客车Observer为了保险它的通用性所以未有参加抽象方法setStatus
abstract class LoginObserver implements Observer{  
    private $login;
    function __construct (Login $login){
        $this->login=$login;
        $login->attach($this);
    }
    function update(Observable $observable){
        if($observable === $this->login){
            $this->doUpdate($observable);
        }
    }
    
    abstract function doUpdate(Login $login);
}

public function notifyObservers()
{
foreach($this->_observers as $observer)
{
if($observer instanceof Observer) $observer->update($this);
}
}
}

class SecurityMonitor extends LoginObserver{  //登录时密码错误的话就发邮件给领导
    function doUpdate(Login $login){
        $status = $login->getStatus();
        if($status[0] == Login::LOGIN_WRONG_PASS){
            //发送邮件
        }
    }
}

interface Observer
{
public function update($observer);
}

class GeneralLogger extends LoginObserver{    //..........
    function doUpdate(Login $login){
        $status = $login->getStatus();    
        //记录登入数量
    }
}

interface DisplayElement
{
public function display();
}

class partnershipTool extends LoginObserver{      //.........
    function doUpdate(Login $login){
        $status = $login->getStatus();    
        //检查iP,设置Cookie    
    }
}

// -- 实例类定义
class NewsObserverable extends Observerable
{
private $_sports_news;
public function setSportsNews($data)
{
$this->_sports_news = $data;
$this->notifyObservers();
}

 //客户端代码
$login = new Login();
new SecurityMonitor($login);
new GeneralLogger($login);
new PartnershipTool($login);

public function getSportsNews()
{
return $this->_sports_news;
}

$login->handleLogin('test','test','test');

private $_local_news;
public function setLocalNews($data)
{
$this->_local_news = $data;
$this->notifyObservers();
}

本文由新浦京81707con发布于软件下载,转载请注明出处:PHP面向对象之观察者模式,观察者模式

关键词: 新浦京81707con

上一篇:关于webWorker的理解和简单例子

下一篇:没有了