>  기사  >  백엔드 개발  >  设计模式--观察者模式_PHP教程

设计模式--观察者模式_PHP教程

WBOY
WBOY원래의
2016-07-14 10:11:28913검색

 

 

 


[php]
/*
考虑如下场景:
1次密码错,提醒重登陆
2次错,出验证码
5次错,验证码变复杂
10次错,锁死账号
 
常规思路:
 
当判断用户名/密码不匹配后 {
 
    if(错) {
        次数+1
    }
 
    if(次数==1) {
    } else if(次数==2){
    } else {
    }....
    ....
 
    这显然不合理
 
}
 
 
 
判断用户名/密码 正确与否  这属于登陆类
登陆成功/失败,进行奖励/惩罚 属于奖惩类.
 
*/ 
 
 
interface Observer { 
    function update($obj); 

 
 
interface Post { 
    function attach($key,$obj); 
    function detach($key); 
 
    function noticefy(); 

 
class User implements Post { 
    public $state = null; 
    public $lastlogin = 0; 
 
    protected $observers = array(); 
 
    public function attach($key,$obj) { 
        $this->observers[$key] = $obj; 
    } 
 
    public function detach($key) { 
        unset($this->observers[$key]); 
    } 
 
    public function noticefy() { 
        foreach($this->observers as $obj) { 
            $obj->update($this); 
        } 
    } 
 
    public function Login() { 
        $this->state = rand(0,1); // 返回0 代表用户名/密码错; 返回1,登陆成功  
         
        // 通知正在监听我的所有对象  
        $this->noticefy(); 
 
         
        return $this->state; 
    } 

 
 
class Log implements Observer{ 
    public function update($obj) { 
        // 日志分析了  
        echo $obj->state?'加1分,记录':'错1次,记录并分析'; 
        echo '
'; 
    } 

 
class Biz implements Observer{ 
    public function update($obj) { 
        echo (time() - $obj->lastlogin) > 1000?'好久没来了':'优质客户'; 
    } 

 
 
 
$user = new User(); 
$log = new log(); 
$biz = new Biz(); 
 
$user->attach('log',$log); 
$user->attach('biz',$biz); 
 
 
//======client端的事了=====//  
 
for($i=1;$i     $user->login(); 
    echo '


'; 

/*
考虑如下场景:
1次密码错,提醒重登陆
2次错,出验证码
5次错,验证码变复杂
10次错,锁死账号

常规思路:

当判断用户名/密码不匹配后 {

    if(错) {
        次数+1
    }

    if(次数==1) {
    } else if(次数==2){
    } else {
    }....
    ....

    这显然不合理

}

 

判断用户名/密码 正确与否  这属于登陆类
登陆成功/失败,进行奖励/惩罚 属于奖惩类.

*/


interface Observer {
    function update($obj);
}


interface Post {
    function attach($key,$obj);
    function detach($key);

    function noticefy();
}

class User implements Post {
    public $state = null;
    public $lastlogin = 0;

    protected $observers = array();

    public function attach($key,$obj) {
        $this->observers[$key] = $obj;
    }

    public function detach($key) {
        unset($this->observers[$key]);
    }

    public function noticefy() {
        foreach($this->observers as $obj) {
            $obj->update($this);
        }
    }

    public function Login() {
        $this->state = rand(0,1); // 返回0 代表用户名/密码错; 返回1,登陆成功
       
        // 通知正在监听我的所有对象
        $this->noticefy();

       
        return $this->state;
    }
}


class Log implements Observer{
    public function update($obj) {
        // 日志分析了
        echo $obj->state?'加1分,记录':'错1次,记录并分析';
        echo '
';
    }
}

class Biz implements Observer{
    public function update($obj) {
        echo (time() - $obj->lastlogin) > 1000?'好久没来了':'优质客户';
    }
}

 

$user = new User();
$log = new log();
$biz = new Biz();

$user->attach('log',$log);
$user->attach('biz',$biz);


//======client端的事了=====//

for($i=1;$i     $user->login();
    echo '


';
}

 

 


 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477316.htmlTechArticle[php] /* 考虑如下场景: 1次密码错,提醒重登陆 2次错,出验证码 5次错,验证码变复杂 10次错,锁死账号 常规思路: 当判断用户名/密码不匹配后...
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.