知识屋:更实用的电脑技术知识网站
所在位置:首页 > 编程技术 > PHP编程

设计模式--观察者模式

发布时间:2015-05-27 19:26:35作者:知识屋

 

 

 


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

 

 


 

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜