设计模式--观察者模式

    以下是自学it网--中级班上课笔记

            网址:www.zixue.it




/*
考虑如下场景:
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 />';
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值