디자인 질문 : 메시지 처리 구성 요소 ... 전화 incorect 과부하 기능 내가 메시지 처리 꼬추를 작성하려고 해요
. 주요 구성 요소는 수신기, 프로세서, 필터, 변환기 및 송신자입니다. 예외, 로깅 및 메트릭을 잡기 위해 프로세서 구성 요소의 "프로세스"기능에서 단일 실패 지점을 갖고 싶습니다.
콘솔 출력이 바로 아래에 있습니다. 오버 라이딩의 비트가 잘못 표시됩니다.
BASE
A
B
A
---FILTER---
FILTERED BASE
DID NOT FILTER A
Looks like a B <------THIS IS WHAT I WANT
DID NOT FILTER B
---PROCESS---
FILTERED BASE
DID NOT FILTER A
DID NOT FILTER B <-----THIS MAKES ME SAD
이 클래스 정의 내가 처리 기능은 필터를 호출 할 ... 아래
#include <string>
#include <iostream>
#include <memory>
//**************MESSAGES ************************
class Message
{
public:
virtual std::string getOut() const {return std::string("BASE");};
};
class MsgA : public Message
{
public:
std::string getOut() const {return std::string("A");};
};
class MsgB : public Message
{
public:
std::string getOut() const {return std::string("B");};
};
//**************FILTERS ************************
class MsgFilter
{
public:
void filter(const std::tr1::shared_ptr<Message> msg)
{
if(msg->getOut().compare("BASE") == 0)
{
std::cout << "FILTERED BASE" << std::endl;
}
else
{
std::cout << "DID NOT FILTER " << msg->getOut() << std::endl;
}
}
void filter(const std::tr1::shared_ptr<MsgB> msg)
{
std::cout << "Looks like a B" << std::endl;
filter((std::tr1::shared_ptr<Message>)msg);
}
};
//**************PROCESSORS ************************
class MsgProcessor
{
public:
MsgProcessor():myFilt(MsgFilter()){}
MsgFilter myFilt;
virtual void process(std::tr1::shared_ptr<Message> msg)
{
myFilt.filter(msg);
}
};
의 주요 기능
#include "AllClassDefs.h"
int main(int argc, char *argv[])
{
std::tr1::shared_ptr<Message> msg(new Message());
std::tr1::shared_ptr<MsgA> msgA(new MsgA());
std::tr1::shared_ptr<MsgB> msgB(new MsgB());
std::cout << msg->getOut() << std::endl;
std::cout << msgA->getOut() << std::endl;
std::cout << msgB->getOut() << std::endl;
std::tr1::shared_ptr<Message> msgAPtr(msgA);
std::cout << msgAPtr->getOut() << std::endl;
std::cout <<"\n\nFILTER---\n";
std::tr1::shared_ptr<MsgFilter> flt(new MsgFilter());
flt->filter(msg);
flt->filter((std::tr1::shared_ptr<Message>) msgA);
flt->filter(msgB);
std::cout <<"\n\nPROCESS---\n";
std::tr1::shared_ptr<MsgProcessor> prc(new MsgProcessor());
prc->process(msg);
prc->process(msgA);
prc->process(msgB);
}
입니다 그래서이다 (MsgB) 기능과하지 필터 (메시지) 기능. 프로세스 (메시지) 기능을 사용하면 Filter가 MsgB를 메시지로 취급합니다. 어떻게하면 잘 작동하게 할 수 있습니까?
템플릿을 사용할 수는 있지만 과장된 것 같습니다. 몇 가지 메시지 클래스가있는 시스템에서 큰 exe로 이어질 수 있습니다. 이중 발송을 사용해야합니까? 아니면 이것에 더 쉬운 해결책이 있습니까?
그래서 ... 템플릿이 유일한 해결책입니까? – Dennis