InternalMessage
의 개체를 개별적으로 처리하고 각각을 ExternalMessage
개체 (내부 메시지와 ExternalMessages 사이에 일대 다 관계가 있음)로 변환하고 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);
및 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 패턴이 있습니까?
임시는 비 const 참조에 바인딩되지 않으므로 제대로 작동하지 않습니다. –
@KerrekSB : 그건 궁금 해서요, 나는 몰랐습니다. 내 코드가 고쳐져 고마워. – mindvirus