php设计模式:观察者理解

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您的余额已不足请及时充值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值