Heim  >  Artikel  >  Backend-Entwicklung  >  设计模式--观察者模式_PHP教程

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

WBOY
WBOYOriginal
2016-07-14 10:11:28900Durchsuche

 

 

 


[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次错,锁死账号 常规思路: 当判断用户名/密码不匹配后...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn