Facade는 라이브러리, 프레임워크 또는 기타 복잡한 클래스 집합에 대한 단순화된 인터페이스를 제공하는 structural design pattern입니다.
정교한 라이브러리나 프레임워크에 속하는 광범위한 개체 집합으로 코드를 작동시켜야 한다고 상상해 보세요. 일반적으로 이러한 개체를 모두 초기화하고, 종속성을 추적하고, 올바른 순서로 Method를 실행하는 등의 작업을 수행해야 합니다.
결과적으로 클래스의 비지니스 논리가 타사 클래스의 구현 세부 정보와 밀접하게 연결되어 이해하고 유지 관리하기가 어렵습니다.
Facade는 많은 움직이는 부분을 포함하는 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하는 클래스입니다. Facade는 하위 시스템과 직접 작업하는 것과 비교하여 제한된 기능을 제공할 수 있습니다. 그러나 여기에는 클라이언트가 실제로 관심을 갖는 기능만 포함됩니다.
Facade를 갖는 것은 수십 가지 기능이 있는 정교한 라이브러리와 앱을 통합해야 할 때 편리하지만 그 기능은 아주 약간만 필요합니다.
예를 들어, 공야이와 함께 짧은 재미있는 비디오를 소셜 미디어에 업로드하는 앱은 잠재적으로 전문적인 비디오 변환 라이브러리를 사용할 수 있습니다. 그러나 실제로 필요한 것은 단일 Method인 encode(filename, format)
가 있는 클래스뿐입니다. 이러한 클래스를 만들고 비디오 변환 라이브러리와 연결하면 첫 번째 Facade가 생깁니다.
전화 주문을 하기 위해 상점에 전화를 걸명 교환원은 상점의 모든 서비스와 부서에 대한 Facade입니다. 교환원은 주문 시스템, 지불 게이트웨이 및 다양한 배송 서비스에 대한 간단한 음성 인터페이스를 제공합니다.
이 예에서 Facade pattenr은 복잡한 비디오 변환 프레임워크와의 상호 작용을 단순화합니다.
코드가 수십 개의 프레임워크 클래스와 직접 작동하도록 하는 대신 해당 기능을 캡슐화하고 코드의 나머지 부분에서 숨기는 Facade 클래스를 만듭니다. 이 구조는 또한 프레임워크의 향후 버전으로 업그레이드 하거나 다른 프레임워크로 교체하는 노력을 최소화하는 데 도움이 됩니다. 앱에서 변경해야 할 유일한 것은 Facade의 Method 구현입니다.
// These are some of the classes of a complex 3rd-party video
// conversion framework. We don't control that code, therefore
// can't simplify it.
class VideoFile
// ...
class OggCompressionCodec
// ...
class MPEG4CompressionCodec
// ...
class CodecFactory
// ...
class BitrateReader
// ...
class AudioMixer
// ...
// We create a facade class to hide the framework's complexity
// behind a simple interface. It's a trade-off between
// functionality and simplicity.
class VideoConverter is
method convert(filename, format):File is
file = new VideoFile(filename)
sourceCodec = new CodecFactory.extract(file)
if (format == "mp4")
destinationCodec = new MPEG4CompressionCodec()
else
destinationCodec = new OggCompressionCodec()
buffer = BitrateReader.read(filename, sourceCodec)
result = BitrateReader.convert(buffer, destinationCodec)
result = (new AudioMixer()).fix(result)
return new File(result)
// Application classes don't depend on a billion classes
// provided by the complex framework. Also, if you decide to
// switch frameworks, you only need to rewrite the facade class.
class Application is
method main() is
convertor = new VideoConverter()
mp4 = convertor.convert("funny-cats-video.ogg", "mp4")
mp4.save()
복잡한 서브 시스템에 대한 제한적이지만 간단한 인터페이스가 필요한 경우 Facade Pattern을 사용하십시오
종종 서브시스템은 시간이 지남에 따라 더 복잡해집니다. Design Pattern을 적용해도 일반적으로 더 많은 클래스가 생성됩니다. 서브 시스템은 다양한 상황에서 더 유연해지고 더 쉽게 재사용할 수 있지만 크라이언트에서 요구하는 구성 및 상용구 코드의 양은 점점 더 커집니다. Facade는 대부분의 클라이언트 요구 사항에 맞는 서브시스템의 가장 많이 사용되는 기능에 대한 바로 가기를 제공하여 이 문제를 해결하려고 시도합니다.
서브시스템을 계층으로 구성하려는 경우 Facade를 사용하십시오
서브시스템의 각 레벨에 대한 진입점을 정의하기 위해 파사드를 작성하십시오. 파사드를 통해서만 통신하도록 요구함으로써 여러 서브시스템간의 결합을 줄일 수 있습니다.
예를 들어 비디오 변환 프레임워크로 돌아가 보겠습니다. 비디오 및 오디오 관련의 두 가지 계층으로 나눌 수 있습니다. 각 레이어에 대해 파사드를 만든 다음 각 레이어의 클래스가 해당 파사드를 통해 서로 통신하도록 할 수 있습니다. 이 접근 방식은 Mediator 패턴과 매우 유사해 보입니다.
O 서브시스템의 복잡성에서 코드를 분리할 수 있습니다.
X Facade는 앱의 모든 클래스에 결합된 a god object가 될 수 있습니다.