观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
1,设置处理事件的接口
3, 设置观察者单一事件的对象集注册器
// Observed.php
namespace App\Services\Observer;
class Observed
{
/**
* 观察的注册主体对象集
* @var array
*/
private $_observers = [];
/**
* 观察的事件
* @var string
*/
public $event;
/**
* 注册的观察者绑定事件参数
* @var
*/
public $post;
public function register($observer)
{
$this->_observers[] = $observer;
}
/**
* 触发执行
*/
public function trigger()
{
$posts = $this->post;
$filter = new EventFilter();
foreach ($this->_observers as $observer) {
$filter->observer = $observer;
$filter->event = $this->event;
$filter->post = $posts;
$filter->handle();
$posts = $filter->post;
}
$this->post = $posts;
return $this;
}
}
4,具体场景调用(以下单事件为例)
$post = $request->all();
DB::beginTransaction();
try {
$observed = new Observed();
$observed->event = EventFilter::EVENT_ORDER_SUBMIT;
$observed->post = $post;
$observed->register(new ObserveUserAddress());
$observed->register(new ObserveShoppingCart());
$observed->register(new ObserveLogistics());
$observed->register(new ObserveOrder());
$observed->register(new ObserveOrderItem());
$observed->trigger();
} catch (\Exception $e) {
DB::rollBack();
return error($e->getMessage());
}
DB::commit();
意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于