php设计模式:观察者理解
现在假设一个场景:
在用户登录时,产品新增要求,让你查看用户余额是否够,不够就疯狂弹窗让他充值。这时候你疯狂撸代码。
过两天产品又加了个需求,让你查看用户是否有消息未处理,没有疯狂提示他。这时候你疯狂撸代码。
需求不断的来
…
如果是这样,我就得在登录后疯狂加代码。
到后面回头一看,看不懂这个登录后,到底要干嘛了。
那么此时我们就得考虑用‘观察者模式’了
观察者简单来理解。
商场的一个入口,通过对每个客户的自动扫描。能获得该客户的信息,例如是VIP客户,赶紧通知 广播 大喊 欢迎光临。如果是普通客户,赶紧弹窗让他充值称为VIP客户。等等,这个扫描分析客户,就等于观察者。
废话不多说,下来撸代码。直观感受一下观察者是怎么实现的。
1.创建观察者接口类(声明成接口纯粹为了规范,你也可以声明成抽象类)
interface Observer
{
// 被观察者即不同角色要实现的方法
// $sender 为角色对象 $params 为需要传递的参数
public function action($sender,$params)
}
//被观察者即角色接口
interface Subject
{
//注册角色到观察者
public function bind($key,Observer $observer);
//删除角色
public function remove($key);
// 各角色统一调度的方法
public function notify();
}
// 被观察者即角色实例
class ConcreteObserve interface Subject
{
public $_observer;
public function bind($key,Observe $observer)
{
$this->_observer[$key] = $observer;
}
public function remove($key){//todo}
public function notify()
{
//关键获取调用改函数的方法
$param = func_get_arg[0];
foreach ($this->_observer as $observer)
{
//$this 可用来获取主题类句柄,在通知中使用
$observer->action($this,$param);
}
}
}
// 声明两个类
class HandelMessageObserver implements Observer
{
public function action($sender,$param)
{
if ($param['unhandelMessage'])
{
echo $param["name"].' 有未处理的信息,请及时处理';
echo "<br/>";
return;
}
echo $param["name"].' 没有新的消息';
echo "<br/>";
}
}
class AddCreditObserve implements Observer
{
public function action($sender,$param)
{
if ($param['addCredit'])
{
echo $param['name'] ."您的余额已不足请及时充值";
}else{
echo "欢迎贵宾".$param['name'];
}
echo '<br>';
}
}
//在控制中调用方法
public function test()
{
//是否有未处理消息
$param['unhandelMessage'] = 1;
//是否需要充值
$param['addCredit'] = 1;
$param['name'] = 'vierhang';
$subject = new ConcreteSubject;
$subject->bind('message',new HandelMessageObserver());
$subject->bind('credit',new AddCreditObserve());
$subject->notify($param);
}
好了,打开浏览器看效果
vierhang 有未处理的信息,请及时处理
vierhang您的余额已不足请及时充值