php用接口实现观察者模式


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');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值