您的位置:首页 > 编程语言 > PHP开发

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

2016-10-08 22:37 756 查看

一、前言:

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

我的噩梦经历:

当时给人家做一个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
}


好了,终于实现了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: