插入队列模式的模式

时间:2012-05-14 03:51:27

标签: c++ stl

我必须处理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模式吗?

1 个答案:

答案 0 :(得分:2)

对我来说没问题。只有我能想到的改变就是让HandleMessage成为一个模板。所以你将template <class T> HandleMessage(const InternalMessage& msg, T& inserter)。通过这种方式,您不会强制此类的用户从抽象基类Inserter派生,并且将避免由于虚函数导致的动态调度所带来的小开销。