티스토리 뷰
728x90
반응형
🚦 C++ 디자인 패턴 - Dispatcher Pattern (디스패처 패턴)
디스패처 패턴은 요청(Request)을 받아 알맞은 처리기(Handler)로 전달하는 구조입니다. 요청 유형에 따라 처리 로직이 다를 때, 중앙에서 분기하여 처리하도록 구성하는 방식입니다.
🧩 구조
- Dispatcher: 요청을 적절한 핸들러로 분기
- Handler: 각 요청 유형에 맞는 처리 클래스
- Request: 요청 정보 (예: 명령 코드, 문자열, enum 등)
🧪 예제 코드
1. 요청 타입 정의
enum class RequestType {
LOGIN,
LOGOUT,
DATA
};
struct Request {
RequestType type;
std::string payload;
};
2. 핸들러 인터페이스 및 구현
class Handler {
public:
virtual void handle(const Request& req) = 0;
virtual ~Handler() = default;
};
class LoginHandler : public Handler {
public:
void handle(const Request& req) override {
std::cout << "[LOGIN] 사용자 로그인: " << req.payload << std::endl;
}
};
class LogoutHandler : public Handler {
public:
void handle(const Request& req) override {
std::cout << "[LOGOUT] 사용자 로그아웃: " << req.payload << std::endl;
}
};
3. 디스패처 구현
class Dispatcher {
std::map<RequestType, std::unique_ptr<Handler>> m_handlers;
public:
void registerHandler(RequestType type, std::unique_ptr<Handler> handler) {
m_handlers[type] = std::move(handler);
}
void dispatch(const Request& req) {
auto it = m_handlers.find(req.type);
if (it != m_handlers.end()) {
it->second->handle(req);
} else {
std::cout << "알 수 없는 요청입니다." << std::endl;
}
}
};
4. 사용 예시
int main() {
Dispatcher dispatcher;
dispatcher.registerHandler(RequestType::LOGIN, std::make_unique<LoginHandler>());
dispatcher.registerHandler(RequestType::LOGOUT, std::make_unique<LogoutHandler>());
dispatcher.dispatch({ RequestType::LOGIN, "User1" });
dispatcher.dispatch({ RequestType::LOGOUT, "User1" });
return 0;
}
✅ 장점
- 요청 유형과 처리 로직의 명확한 분리
- OCP(Open/Closed Principle) 적용 가능 – 핸들러만 추가
- 모듈화와 테스트 용이
⚠️ 단점
- 핸들러 수가 많아지면 등록 및 관리 복잡도 증가
- Dispatcher가 모든 분기를 관리해야 하므로 비대화될 수 있음
🛠 사용 사례
- 웹 프레임워크의
FrontController
- 네트워크 패킷 처리기 (메시지 ID에 따라 분기)
- 게임 엔진의 입력 이벤트 라우팅
728x90
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 서귀포
- 서귀포블루버블
- 블루버블다이브팀
- C#
- DLL
- 울릉도
- ReFS
- C# 고급 기술
- Build
- CMake
- 스쿠버다이빙
- C#.NET
- 블루버블다이빙팀
- Linux
- Windows
- 제주도
- 윈도우
- ip
- PowerShell
- 성산블루버블
- 리눅스
- 암호화
- 패턴
- Thread
- OpenSource
- 현포다이브
- C
- 블루버블
- 디자인패턴
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함