PHP面向对象之观望者方式

    观看者情势按我的的知情,主要分为观望者类和被被观察者类二个部分。被观看者类会继承一个接口(如:Observable)完成对观望者的拉长、删除和文告(即公告观望者暴发了一定事件),它聚合了观望者类具体看原书类图。而观看者类继承一个接口(如:Observer)完成一个抽象方法update(),以下代码示例中此措施还将收到一个参数即被观望者,按照被观看者的情景来决定是不是实施自身的业务逻辑。好了拉家常不多说平昔上代码。

//被观察者类
interface Observable {
    function attach(Observer $observer);    //添加观察者
    function detach(Observer $observer);    //删除观望者
    function notify();              //公告观望者
}

//一个甩卖登陆音信的类
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)){                  //那里模拟了3种登陆状态
            case 1:
              
 $this->setStatus(self::LOGIN_ACCESS,$user,$ip);  //设置被观看者的情形,公告观察者后,观察者将跟据状态来进行相应的政工逻辑
                $ret =true;
                break;
            case 2:
ACCESS,              
 $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)
    }
}

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

//这几个类重若是为着有限支撑传递过来的被观望者对象是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);
}

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

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

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

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

$login->handleLogin(‘test’,’test’,’test’);

说到底: 路漫漫其修远兮,吾将上下而求索!

相关文章