观察者模式(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,
抢沙发
还没有评论,你可以来抢沙发