美文网首页
发布订阅模式

发布订阅模式

作者: pengtoxen | 来源:发表于2019-05-14 19:19 被阅读0次

在发布订阅模式中,发布者和订阅者之间多了一个发布通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件,以此避免发布者和订阅者之间产生依赖.

这个模式其实就是观察者模式的另一种实现

模式
------------------------------------------------------------------------------
观察者模式                 监听者             无                      被监听者
发布订阅模式               监听者            发布通道                  被监听者
------------------------------------------------------------------------------
微博大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有新消息,把发布消息的委托给消息中心来处理.

相关文章

网友评论

      本文标题:发布订阅模式

      本文链接:https://www.haomeiwen.com/subject/mameaqtx.html