设计模式-观察者模式(PHP实现)

一、前言:

说实话,本来我是不太想写关于观察者模式的博客的,一是我前面已经学了好几个设计模式,我都没有写,二是网上的关于设计模式的资源已经处于一个充足的状态。但是!学完之后我想到了之前我的一个噩梦似的经历,促使我必须完成这篇博客:

我的噩梦经历:
当时给人家做一个O2O微信商城的项目,就是在处理订单这块,当一个用户购买东西成功了之后,要更新订单表,用户积分表,用户购买记录表,系统结算表。。。。,结果是什么?由于当时自己的水平实在是低到负一层(虽然现在也不咋地吧。。。),结果是将所有的逻辑处理全部写在一个类里面,一旦出现错误,然后在找错误的时候那个凌乱啊。。。。。综合各种情况以及对应的处理,那个类文件有差不多3000行代码!这你敢信?

二、观察者模式实现:

1、观察者模式:当一个对象状态发生变化的时候,依赖他的对象会全部收到通知,并自动更新
2、场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接假如处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码
3、观察者模式实现了低耦合,非侵入式的通知,与更新机制

废话不多说,直接上代码:

//事件产生者(被观察者)
abstract class EventGenerator
{

    //保存众多观察者实例
    private $observers = array();

    //事件触发
    public abstract function trigger();

    //添加观察者
    function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    //通知观察者
    function notify()
    {
        foreach ($this->observers as $val) {
            $val->update();
        }
    }
}

//观察者接口
interface Observer
{
    function update($event_info = null);
}

//具体事件
class Event extends EventGenerator
{
    //事件触发
    function trigger()
    {
        echo "事件发生";
        //通知观察者
        $this->notify();
    }
}

//观察者1
class Observer1 implements Observer
{
    function update($event_info = null)
    {
        echo "观察者1接收到通知并执行更新";
    }
}

//观察者2
class Observer2 implements Observer
{
    function update($event_info = null)
    {
        echo "观察者2接收到通知并执行更新";
    }
}

//客户端
class Client
{
    static function Main()
    {
        $observer1 = new Observer1();
        $observer2 = new Observer2();
        $event = new Event();
        $event->addObserver($observer1);
        $event->addObserver($observer2);
        $event->trigger();
    }
}

Client::Main();

在客户端中,$event->trigger() 事件发生,导致observer1和observer2发生了变化,但是这些逻辑处理不是直接写在trigger()方法里面的,而是在observer1和observer2内部发生的,这样的话代码的维护和分工就变得有序而简单。

一般在一个事件发生触发多事件发生是一个事务处理,在这里我们可以直接在notify() 里面实现就好了:

function notify()
{
    //事务开始:
    foreach ($this->observers as $val) {
        $res = $val->update();
        if(!$res){
            //事务回滚rollback
        }
    }
    //事务提交commit
}

好了,终于实现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值