插入队列的模式模式
Pattern for modes of inserting into a queue
我必须处理类型为 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
派生,并且可以避免由于虚函数引起的动态调度引起的少量开销。
相关文章:
- boost::进程间消息队列引发错误
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 在 C++11 中,lambda 队列是否是工作队列的良好设计模式
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 插入队列的模式模式
- 命令模式队列按时间排序