前言
第一篇php博客,聊一下php设计模式之观察者模式
一、什么是设计模式?
每一个设计模式描述的都是在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
每一个模式都有他本身的有点和缺点,根据问题的不同选择出适合的模式去使用,这样,我们就能一次又一次地根据
使用场景不同使用二使用方案,并且不必做重复劳动
二、进入正题
什么是观察者模式?
观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新!
所有的观察者(observer)全部被注册(register函数)进入数组(事件的_observers[]数组),这样,当事件
有变化的时候,就能通过遍历来通知所有的观察者
代码部分
<?php
/**
* 观察者模式
*/
class Paper{ /* 主题 */
private $_observers = array();
public function register($sub){ /* 注册观察者 */
$this->_observers[] = $sub;
}
public function trigger(){ /* 外部统一访问 */
if(!empty($this->_observers)){
foreach($this->_observers as $observer){
$observer->update();
}
}
}
}
/**
* 观察者要实现的接口
*/
interface Observerable{
public function update();
}
class Subscriber implements Observerable{
public function update(){
echo "Callback\n";
}
}
2.测试
代码如下(示例):
/* 测试 */
$paper = new Paper();
$paper->register(new Subscriber());
//$paper->register(new Subscriber1());
//$paper->register(new Subscriber2())
$paper->trigger();
该处使用的url网络请求的数据。
总结
/**
*当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框
架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。
*/
设计模式虽好,但需要我们不断的去理解和实践,有能力的可以思考自己的设计理念,并去实践
三、额外的内容
/**
* 事件产生类
* Class EventGenerator
*/
abstract class EventGenerator
{
private $ObServers = [];
//增加观察者
public function add(ObServer $ObServer)
{
$this->ObServers[] = $ObServer;
}
//事件通知
public function notify()
{
foreach ($this->ObServers as $ObServer) {
$ObServer->update();
}
}
}
/**
* 观察者接口类
* Interface ObServer
*/
interface ObServer
{
public function update($event_info = null);
}
/**
* 观察者1
*/
class ObServer1 implements ObServer
{
public function update($event_info = null)
{
echo "观察者1 收到执行通知 执行完毕!\n";
}
}
/**
* 观察者1
*/
class ObServer2 implements ObServer
{
public function update($event_info = null)
{
echo "观察者2 收到执行通知 执行完毕!\n";
}
}
/**
* 事件
* Class Event
*/
class Event extends EventGenerator
{
/**
* 触发事件
*/
public function trigger()
{
//通知观察者
$this->notify();
}
}
//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();
最后说明一下今天为什么写这篇文章,目前我在做微信小程序,碰到了一个关于弹窗图片和模态弹窗的执行先后
问题,按普通的代码执行顺序的方法行不通,后来请教了一个大佬,说了解一下发布订阅模式,网上找了些资料看了
看,感觉非常有用,搞定后有找了些php的一些类似发布订阅的观察者模式学习了一下,放到这里,大家可以学习一下
部分转载至范仁义