程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 設計模式--觀察者模式

設計模式--觀察者模式

編輯:關於PHP編程

 

 

 


[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 '<br />'; 
    } 

 
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<10;$i++) { 
    $user->login(); 
    echo '<hr />'; 

/*
考慮如下場景:
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 '<br />';
    }
}

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<10;$i++) {
    $user->login();
    echo '<hr />';
}

 

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved