interface Observable{
function attach(Observer $observer);
function detach(Observer $observer);
function notify();
}
class Login implements Observable{
private $observers=array();
const LOGIN_USER_UNKNOW=3;
const LOGIN_WRONG_PASS=2;
const LOGIN_ACCESS=1;
private $status=array();
function handleLogin($type,$user,$ip){
switch($type){
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_UNKNOW,$user,$ip);
$ret=false;
break;
}
$this->notify();
return $ret;
}
private function setStatus($stat,$user,$ip){
$this->status=array($stat,$user,$ip);
}
function getStatus(){
return $this->status;
}
function attach(Observer $observer){
$this->observers[]=$observer;
}
function detach(Observer $observer){
foreach($this->observers as $obs=>$value){
if($observer==$value){
unset($this->observers[$obs]);
}
}
$this->observers;
}
function notify(){
foreach($this->observers as $obs){
$obs->update($this);
}
}
function getObserver(){
return $this->observers;
}
}
interface Observer{
function update(Observable $observable);
}
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){
print __CLASS__ .":\t sending mail to sysadmin\n";
}else{
print "没有找到";
}
}
}
class GeneralLogger extends LoginObserver{
function doUpdate(Login $login){
$status=$login->getStatus();
if($status[0]==Login::LOGIN_ACCESS){
print __CLASS__ .":添加数据到日志中 <br/>";
}
}
}
class PartnershipTool extends LoginObserver{
function doUpdate(Login $login){
$status=$login->getStatus();
if(preg_match("/^[0-9]{1,3}(\.[0-9]{1,3}){3}/",$status[2])){
print __CLASS__ .": 如果ip正确则添加cookies里面 <br>";
}
}
}
//执行步骤:1、建立login对象 2、建立Observer对象就是下面的partnershipTool和GeneralLogger,然后把$login对象添加进p\G\S中他们构造函数
//会自动调动attach添加$login对象,然后调用handleLogin函数执行notify()函数,notify()函数再调用LoginObserver抽象函数中的update,再调用子类里面的doUpdate函数
$login=new Login();
new PartnershipTool($login);
new GeneralLogger($login);
new SecurityMonitor($login);
$login->handleLogin(Login::LOGIN_ACCESS,'小东','233.25.36.41');
php用接口实现观察者模式
最新推荐文章于 2024-08-13 15:52:19 发布