观察者模式-php

观察者模式:当你的某个功能在后期可能添加很多不太相干的功能时,可以考虑使用观察者模式,

如一个用户登录类,后期可能要求,记录登录用户日志,短信提醒,邮件提醒等功能.个人更愿意叫他补丁模式.

简单说,就是将每个补丁定义为一个类,这些补丁类实现同一接口,这些补丁类实现同一方法.

原始类只要接收这些补丁类的对象,然后运行对象中的方法即是执行补丁.

class Login{
    private $patches=array();//存储补丁对象
    //添加补丁
    function addPatch(Patches $patch){
        $this->patches[]=$patch;
    }
    //用户注册功能
    function handleLogin($user,$pass,$ip){
        //验证用户信息等
        //调用注册对象的方法     
    foreach ($this->patches as $patch) {
           $patch->execPatch($this);
    }
    }   }
//补丁类要实现的接口
interface Patches{
    function execPatch(Login $login);
}
//添加一个发送邮件的功能
class SendMail implements Patches{ function execPatch(Login $login) { //发送邮件 }}$login=new Login();$login->addPatch(new SendMail());//添加补丁$login->handleLogin('张三','123','192.168.23.45');//验证用户,同时执行补丁
//如果后期想要添加新的功能的话,直接添加实现Patches接口的类即可,如记录用户日志
//添加一个发送邮件的功能
class Logger implements Patches{
    function execPatch(Login $login)
    {
        //记录用户日志
    }
}
$login->addPatch(new Logger());//添加补丁
完毕!!!
php自带有观察者模式的类:SplObserver,SplSubject,SplObjectStorage
其中SplObserver相当于Patches接口
SplObjectStorage相当于Patches对象
SplSubject相当于Login类
class Login implements SplSubject{
    private $storage=array(); //存放观察者对象
    function __construct()
    {
        $this->storage=new SplObjectStorage();//生成观察者对象,存入数组
    }
    //添加观察者对象
    function attach(SplObserver $observer)
    {
        $this->storage->attach($observer);
    }
    //删除观察者对象
    function detach(SplObserver $observer)
    {
        $this->storage->detach($observer);
    }
    function notify(){}
    function handleLogin($user,$pass,$ip){
        //处理用户数据
        //调用每个观察者对象的处理方法
        foreach ($this->storage as $obs) {
            $obs->update($this);
        }
return 用户验证结果;
    }
}
//扩展一下SplObserver,添加一个doUpdate方法,供子类实现
abstract class LoginObserver implements SplObserver{
    private $login;
    function __construct(Login $login)
    {
        $this->login=$login;
        $login->attach($this);
    }
    function update(SplSubject $subject)
    {
        $this->doUp($this->login);
    }
    abstract function doUpdate(login $login);
}
//添加日志功能
class Logger extends LoginObserver{
    function doUpdate(login $login)
    {
        //写日志
    }
}
//添加邮件功能
class Mail extends LoginObserver{
    function doUpdate(login $login)
    {
        //发送邮件
    }
}
$login=new Login();
$login->attach(new Logger($login));//添加日志处理功能
$login->handleLogin('张三','123','192.168.23.45');//执行日志处理功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值