例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常。根据用户的爱好,在用户登录后给予相应的猜你喜欢。如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责。那我们该怎么完成呢?
php 在 5.1 之后有自带的 --> 观察者 observer 和 被观察者 subject 接口。
观察者模式分为观察者、与被观察者。观察者时刻监听被观察动态,及时做出相应改变。
直接上代码:
<?php
header("content-type:text/html;charset=utf8");
class usr implements SplSubject{
public $lognum;
public $hobby;
protected $observers=null;
public function login(){
$this->notify();
}
public function __construct($hobby){
$this->lognum=rand(1,12);
$this->hobby=$hobby;
$this->observers=new SplObjectStorage();
}
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 Login implements SPLObserver{
public function update(SplSubject $subject){
if($subject->lognum < 3){
echo '这是第'.$subject->lognum."次安全登陆。"."<br>";
}else{
echo '这是第'.$subject->lognum."次登陆,异常"."<br>";
}
}
}
class Hobby implements SplObserver{
public function update(SplSubject $subject){
if($subject->hobby=="sports"){
echo '健身是身体健康的最佳捷径。';
}else{
echo"热爱生活!!!";
}
}
}
$use= new usr("sports");
$use->attach(new Login());
$use->attach(new Hobby());
$use->login();
?>