观察者模式:当你的某个功能在后期可能添加很多不太相干的功能时,可以考虑使用观察者模式,
如一个用户登录类,后期可能要求,记录登录用户日志,短信提醒,邮件提醒等功能.个人更愿意叫他补丁模式.
简单说,就是将每个补丁定义为一个类,这些补丁类实现同一接口,这些补丁类实现同一方法.
原始类只要接收这些补丁类的对象,然后运行对象中的方法即是执行补丁.
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');//执行日志处理功能