再看设计模式——中介者模式与观察者模式

观察者模式(Observer)是典型的订阅发布,是event机制的常见实现模式,MVC中的M和V之间的数据流订阅变动就靠这个模式实现。有push推模型(通知所有可能的事件处理)和pull拉模型(感兴趣的事件处理自己获取)两种实现(java中有java.util.Observer接口可以参考)。

// push推模型的实现
class Observer
{
public:
    virtual void onNotify(Event event, Entity& entity) = 0; // 子类继承来实现event的具体处理
}; // 对应MVC中的V

class Subject
{
public:
    void addObserver(Observer* obs);
    void notify(Event event, Entity& entity)
    {
         for_each(observers_[i]->onNotify(event, entity));
    }
private:
    Observer* observers_[MAX]; // 可以使用链表来动态扩容
}; // 对应MVC中的M

这个实现的问题是event机制是同步的,并没有异步化。另一个问题是事件处理的顺序。

// pull拉模型的实现
class Observer
{
public:
    virtual void onNotify() = 0; // 子类继承来实现从subject中根据是否changed来获取event的具体处理
    void register()
    {
         subject->addObserver(this); // 自己去注册
    }
private:
    Subject* subject;
};

class Subject
{
public:
    void addObserver(Observer* obs);
    void notify()
    {
         for_each(observers_[i]->onNotify());
    }
    void setChanged() { changed = true; }
    virtual void getEvent(Event event, Entity& entity) = 0;
private:
    bool changed;
    Observer* observers_[MAX]; // 可以使用链表来动态扩容
};

中介者模式(Mediator)其实就是MVC中的Controller,


本文是全系列中第6 / 7篇:再看设计模式

打赏作者
提交看法

抢沙发

还没有评论,你可以来抢沙发