在发布订阅模式中,发布者和订阅者之间多了一个发布通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件,以此避免发布者和订阅者之间产生依赖.
这个模式其实就是观察者模式的另一种实现
模式
------------------------------------------------------------------------------
观察者模式 监听者 无 被监听者
发布订阅模式 监听者 发布通道 被监听者
------------------------------------------------------------------------------
微博大V更新的例子
------------------------------------------------------------------------------
观察者模式 粉丝A 博主king
发布订阅模式 粉丝B `消息中心` 博主king
可以看到,这里的区别就是多了一个消息中心,那么这个消息中心
是什么东西呢?
//事件产生抽象类
abstract class EventGenerator{
$eventHub = null;
//注入EventHub实例作为消息中心
function __construct(BaseEventHub $hub){
$this->eventHub = $hub;
}
function trigger(){
echo '我的微博更新了,粉丝们'
//被观察者的逻辑如果有更改,通知观察者
$this->eventHub->notify();
}
}
//被观察者(微博博主king)
class King extends EventGenerator{}
//消息中心抽象类
abstract class BaseEventHub{
private $observers = array();
//新增观察者
function addObserver(Observer $observer){
$this->observers[] = $observer;
}
//执行观察者的方法
function notify(){
foreach ($this->observers as $key => $observer) {
//执行更新方法
$observer->update();
}
}
}
//消息中心类
class EventHub extends BaseEventHub{}
//观察者抽象接口
interface Observer{
function update($event_info = null);
}
//观察者1(king的粉丝A)
class A implements Observer{
function update($event_info = null){
//针对粉丝A的业务逻辑
echo "你很棒";
}
}
//观察者2(king的粉丝B)
class B implements Observer{
function update($event_info = null){
//针对粉丝B的业务逻辑
echo "不错的粉丝";
}
}
//消息中心
$eventHub = new EventHub();
$eventHub->addObserver(new A());//添加粉丝A
$eventHub->addObserver(new B());//添加粉丝B
$king = new King($eventHub);//博主king
$king->trigger();//触发器,通过注入的$eventHub通知粉丝A和B,我有新微博
这样就把发布者和订阅者之间的依赖解耦了,有新粉丝C进来就添加进消息中心.由消息中心来维护粉丝.博主king有新消息,把发布消息的委托给消息中心来处理.
网友评论