Jamers Posted April 17, 2019 Report Share Posted April 17, 2019 使用场景模拟,例如:登录过程中,有很多相关日志、积分或者某些活动参加部分解耦,将这些相关联模块采用观察者模式,用户登录时添加这些观察者,通知一次,观察者们会自动调用相关的方法处理。避免登录模块中掺杂过多的其他方面的代码。 /** * 事件产生类 * Class EventGenerator */ abstract class EventGenerator { private $ObServers = []; //增加观察者 public function add(ObServer $ObServer) { $this->ObServers[] = $ObServer; } //事件通知 public function notify($msg = '') { foreach ($this->ObServers as $ObServer) { $ObServer->update($msg); } } } /** * 观察者接口类 * Interface ObServer */ interface ObServer { public function update($event_info = null); } /** * 观察者1 */ class ObServer1 implements ObServer { public function update($event_info = null) { var_dump($event_info); echo "观察者1 收到执行通知 执行完毕!\n"; } } /** * 观察者1 */ class ObServer2 implements ObServer { public function update($event_info = null) { var_dump($event_info); echo "观察者2 收到执行通知 执行完毕!\n"; } } /** * 事件 * Class Event */ class Event extends EventGenerator { /** * 触发事件 */ public function trigger() { //通知观察者 $this->notify(mt_rand(1, 10)); } } //创建一个事件 $event = new Event(); //为事件增加旁观者 $event->add(new ObServer1()); $event->add(new ObServer2()); //执行事件 通知旁观者 $event->trigger(); sleep(1); $event->trigger(); Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now