我必须处理 InternalMessage
类型的单个对象,将每个对象转换为一定数量的 ExternalMessage
对象(InternalMessages 和 ExternalMessages 之间存在一对多关系), 并将这些 ExternalMessage
对象放入队列中进行处理。我想有两种插入此队列的模式 - 批处理,其中所有 ExternalMessage
都以原子方式插入队列,以及正常插入,其中插入 ExternalMessage
对象在创建时放入队列。请注意,有多个线程为此队列生成消息。
我想解决这个问题是有一个 Inserter
对象,它处理插入:
class Inserter {
public:
void ProcessMessage(const ExternalMessage& externalMessage) = 0;
};
class SingleInserter {
public:
SingleInserter(Queue* q) : m_q(q) { }
void ProcessMessage(const ExternalMessage& externalMessage) {
m_q->Insert(q);
}
private:
Queue* m_q;
};
class BatchInserter {
public:
BatchInserter(Queue* q) : m_q(q) { }
void ProcessMessage(const ExternalMessage& externalMessage) {
m_cache.Insert(externalMessage);
}
~BatchInserter() {
m_q->BatchInsert(m_cache);
}
private:
Queue* m_q;
List<ExternalMessages> m_cache;
};
然后在创建消息时将 Inserter
传递到调用堆栈中。
BatchInserter ins;
或
SingleInserter ins;
然后
HandleMessage(someInternalMessage, ins);
HandleMessage 会做:
void HandleMessage(const InternalMessage& msg, Inserter& ins) {
//... do logic, eventually create a externalMsg (note - this could be further down
//the call stack, in a loop, etc. Multiple external messages could be created each
//call to HandleMessage)
ins.ProcessMessage(externalMsg);
}
这个设计理想吗?它允许不同的插入类型,这很好,但是是否有某种方法可以做到这一点而不必将对象向下传递到调用堆栈(例如,通过模板特化)?其次,我在实现它时是否应该遵循 STL 模式?
最佳答案
我觉得还行。我能想到的唯一改变是制作HandleMessage
一个模板。所以你会有template <class T> HandleMessage(const InternalMessage& msg, T& inserter)
.这样你就不会强制这个类的用户从抽象基类派生 Inserter
并且会避免由于虚函数动态调度带来的小开销。
关于c++ - 插入队列模式的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10577334/