디자인 패턴 총정리 시리즈의 열한 번째 패턴은 Facade Pattern입니다.
Facade 패턴은 복잡한 하위 시스템을 숨기는 간단한 인터페이스를 제공합니다.
해당 게시물에서 이러한 Facade 패턴에 대한 간단한 개념과 사용 예시, 장/단점을 알아보겠습니다.
1. 개요
Facade 패턴은 구조패턴 중 하나로써 서브시스템이 가지고 있는 인터페이스 집합에 대한 통합 인터페이스를 제공하는 구조패턴입니다. 이러한 패턴은 클라이언트를 복잡한 하위 시스템으로부터 보호하고, 클라이언트가 보다 쉽게 하위 시스템과 상호 작용활 수 있도록 하는 단순화된 진입점을 제공합니다.
즉, Facade 패턴은 복잡한 상호 작용과 작업을 단일 인터페이스 내에 캡슐화함으로써 느슨한 결합을 만들고 코드 유지보수를 용이하게 합니다.
해당 패턴은 Facade와 Complex system 2가지 주요 컴포넌트로 구성되어 있습니다.
2. 예시
다음은 Facade 패턴을 사용한 멀티미디어 시스템 시나리오를 생각해 보겠습니다.
각 컴포넌트는 고유한 작업과 구성을 가지고 있습니다. 이러한 작업을 개별적으로 구현한다면, 시간이 오래 걸리고 구현이 완료되었을 대 오류가 발생하기 쉽습니다. 이러한 예시에 Facade 패턴을 적용하여 해당 시스템을 원활하게 제어하고 상호 작용할 수 있는 구조를 구현해 보겠습니다.
// Subsystem 1: Audio Player
class AudioPlayer {
public:
void play() {
// Logic to play audio
}
void stop() {
// Logic to stop audio
}
// Additional audio operations...
};
// Subsystem 2: Video Player
class VideoPlayer {
public:
void play() {
// Logic to play video
}
void stop() {
// Logic to stop video
}
// Additional video operations...
};
// Subsystem 3: Display Manager
class DisplayManager {
public:
void show() {
// Logic to show display
}
void hide() {
// Logic to hide display
}
// Additional display operations...
};
// Facade
class MultimediaFacade {
private:
AudioPlayer audioPlayer;
VideoPlayer videoPlayer;
DisplayManager displayManager;
public:
void playAudio() {
audioPlayer.play();
}
void stopAudio() {
audioPlayer.stop();
}
void playVideo() {
videoPlayer.play();
displayManager.show();
}
void stopVideo() {
videoPlayer.stop();
displayManager.hide();
}
};
int main() {
// Client code using the Facade
MultimediaFacade multimediaFacade;
multimediaFacade.playAudio();
multimediaFacade.playVideo();
multimediaFacade.stopAudio();
multimediaFacade.stopVideo();
return 0;
}
해당 예시에서는 세 개의 하위 시스템이 있습니다. 하위 시스템은 다음과 같습니다.
- Audio Player
- Video Player
- Display Manager
MultimediaDacade 클래스는 위와 같은 하위 시스템과 상호 작용할 수 있는 간소화된 인터페이스를 제공합니다. 이를 통해 클라이언트는 개별 시스템의 복잡한 구성을 이해할 필요 없이 Facade 클래스가 제공하는 상위 레벨의 인터페이스만 활용하여 프로그램을 제어할 수 있습니다.
3. 장점
- Simplified Interface
: Facade 패턴은 간소화된 인터페이스를 제공하여 클라이언트를 하위 시스템의 복잡성으로부터 보호합니다. - Code Organization and Maintainability
: 복잡한 작업을 캡슐화함으로써 코드가 더욱 체계적이고 모듈화 될 수 있습니다. 하위 시스템 또한 변경이 용이해집니다. - Loose Coupling
: 클라이언트와 서브시스템 간의 느슨한 결합을 촉진합니다. 이는 클라이언트와 내부 객체 간의 종속성을 줄이고 내부 객체를 독립적으로 만들어줍니다.
4. 단점
- Limited Flexibility
: Facade 패턴의 단순함은 유연성을 약화시킬 수 있습니다. 클라이언트가 세밀한 제어를 원하는 경우 Facade 구조를 우회하여 동작해야 합니다. - Increased Abstraction
: Facade를 사용하면 추상화 계층이 추가되기 때문에 복잡성을 증가시킬 수 있습니다.
5. 결론
Facade 패턴은 간소화된 인터페이스를 제공하여 복잡한 시스템을 관리할 수 있도록 돕는 도구입니다. 하위 시스템을 캡슐화하고 느슨한 결합을 촉진해 코드의 유지 보수성을 높입니다. 하지만, 세분화된 제어를 제한하고 추가적인 추상화 계층이 발생하기 때문에 한계점이 있을 수 있습니다.
설계 상 이러한 장단점을 이해한다면, 깔끔하고 모듈화 된 소프트웨어 시스템을 구축할 수 있습니다.
'Study > Software Architecture' 카테고리의 다른 글
[디자인패턴] 구조패턴(7) - Flyweight Pattern (플라이웨이트 패턴) (0) | 2023.06.06 |
---|---|
[디자인패턴] 구조패턴(5) - Decorator Pattern (데코레이터 패턴) (0) | 2023.05.26 |
[디자인패턴] 구조패턴(4) - Composite Pattern (컴포지트 패턴) (0) | 2023.05.25 |
[디자인패턴] 구조패턴(3) - Proxy Pattern (프록시 패턴) (0) | 2023.05.24 |
[디자인패턴] 구조패턴(2) - Bridge Pattern (브릿지 패턴) (0) | 2023.05.23 |