插入队列的模式模式

  • 本文关键字:模式 队列 插入 c++ stl
  • 更新时间 :
  • 英文 :


我必须处理类型为 InternalMessage 的单个对象,将每个对象转换为一定数量的ExternalMessage对象(内部消息和外部消息之间存在一对多关系(,并将这些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);

和句柄消息将做:

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派生,并且可以避免由于虚函数引起的动态调度引起的少量开销。

最新更新