복잡한 시스템을 더 쉽게 사용하기 위한 high-level의 인터페이스를 제공
- Facade : GameFacade
- Subsystems : Input,Sound,Graphics
#include <iostream> #include <string> #include <vector> // 복잡한 서브시스템 1: 입력 class Input { public: void Initialize() { std::cout << "입력 시스템 초기화" << std::endl; }; }; // 복잡한 서브시스템 2: 그래픽 class Graphics { public: void Initialize() { std::cout << "그래픽 시스템 초기화" << std::endl; }; }; // 복잡한 서브시스템 3: 사운드 class Sound { public: void Initialize() { std::cout << "사운드 시스템 초기화" << std::endl; }; }; // 서브시스템들에 대한 단일 인터페이스를 제공하는 퍼사드 클래스 class GameFacade { private: Sound sound; Graphics graphics; Input input; public: // 클라이언트는 이 함수 하나만 호출하면 됨 void Init() { // 내부적으로는 복잡한 서브시스템들을 순서에 맞게 초기화 sound.Initialize(); graphics.Initialize(); input.Initialize(); } }; int main() { GameFacade game; // 복잡한 내부 과정을 알 필요 없이, 간단한 메서드 호출만으로 초기화 완료 game.Init(); return 0; }
- 복잡성 은닉 : main 함수(클라이언트)는 게임을 초기화하기 위해 Sound, Graphics, Input 객체를 각각 생성하고 Initialize()를 순서대로 호출해야 하는 복잡한 과정을 알 필요가 없다.
- 단일 진입점(Single Entry Point) : GameFacade의 Init() 메서드가 모든 서브시스템에 대한 '단일 창구' 역할을 한다. 클라이언트는 이 창구를 통해서만 시스템과 상호작용하면 된다.
- 결합도 감소: 클라이언트 코드(main)는 퍼사드 클래스(GameFacade)에만 의존하고, 개별 서브시스템들에는 직접 의존하지 않는다. 따라서 나중에 그래픽 시스템이 다른 것으로 교체되더라도 GameFacade 내부만 수정하면 되므로 클라이언트 코드는 영향을 받지 않는다.