我必须处理InternalMessage
类型的单个对象,将每个对象转换为一些ExternalMessage
个对象(InternalMessages和ExternalMessages之间存在一对多的关系),并将这些对象{ {1}}要处理的队列上的对象。我希望有两种插入此队列的模式 - 批处理,所有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将会:
HandleMessage(someInternalMessage, ins);
这个设计理想吗?很高兴它允许不同的插入类型,但是有一些方法可以做到这一点而不必将对象传递给调用堆栈(例如,通过模板专门化)?其次,在实现这个时我应该遵循一个STL模式吗?
答案 0 :(得分:2)
对我来说没问题。只有我能想到的改变就是让HandleMessage
成为一个模板。所以你将template <class T> HandleMessage(const InternalMessage& msg, T& inserter)
。通过这种方式,您不会强制此类的用户从抽象基类Inserter
派生,并且将避免由于虚函数导致的动态调度所带来的小开销。