タイプの個々のオブジェクトを処理しInternalMessage
、それぞれをいくつかのExternalMessage
オブジェクトに変換し(InternalMessagesとExternalMessagesの間には1対多の関係があります)、これらのExternalMessage
オブジェクトをキューに入れて処理する必要があります。このキューに挿入する2つのモードが必要です。すべてが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パターンはありますか?