티스토리 뷰

공부/디자인 패턴

Dispatcher Pattern

-=HaeJuK=- 2025. 4. 22. 15:49
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
링크
«   2025/05   »
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
글 보관함