我必须处理 type 的单个对象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 模式吗?