2012-05-14 2 views
1

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 패턴이 있습니까?

+0

임시는 비 const 참조에 바인딩되지 않으므로 제대로 작동하지 않습니다. –

+0

@KerrekSB : 그건 궁금 해서요, 나는 몰랐습니다. 내 코드가 고쳐져 고마워. – mindvirus

답변

2

괜찮습니다. 내가 생각할 수있는 변경은 HandleMessage 템플릿을 만드는 것입니다. 그러면 template <class T> HandleMessage(const InternalMessage& msg, T& inserter)이됩니다. 이를 통해이 클래스의 사용자가 추상 기본 클래스 Inserter에서 파생되지 않도록하고 가상 함수로 인한 동적 디스패치로 인한 약간의 오버 헤드를 피할 수 있습니다.