-
Facade Pattern(퍼사드 패턴)STUDY/디자인패턴 2025. 1. 7. 19:41
퍼사드 패턴이란?
라이브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴
구조
- Facade
퍼사드 클래스를 통해 하위 시스템 기능들의 특정 부분에 편리하게 접근할 수 있다. 또 클라이언트의 요청을 어디로 보내야 하는지와 움직이는 모든 부품을 어떻게 작동해야 하는지를 알고 있다.
- Additional Facade
추가적인 퍼사드 클래스를 생성을 통해 연관되지 않은 부분을 분리해 복잡한 구조로 만드는 것을 방지할 수 있다. 클라이언트나 다른 퍼사드에서 사용할 수 있다.
- Subsystem Class
복잡한 하위 시스템은 수십 개의 다양한 객체들로 구성된다. 이 모든 객체가 의미 있는 작업을 수행하도록 하려면, 하위 시스템의 세부적인 구현 정보를 깊이 있게 살펴야 한다. 예를 들어 올바른 순서로 객체들을 초기화하고 그들에게 적절한 형식의 데이터를 제공하는 등의 작업을 수행해야 한다.
하위 시스템 클래스들은 퍼사드의 존재를 인식하지 못하며, 이들은 시스템 내에서 작동하며 매개체 없이 직접 서로와 작업한다.
- Client
하위 시스템 객체들을 직접 호출하는 대신 퍼사드를 사용한다.
예시
퍼사드 패턴을 사용해 복잡한 비디오 변환 프러임워크와의 상호작용을 단순화시킬 수 있다.
Subsystem Class
public class VideoFile { private String name; private String codecType; public VideoFile(String name) { this.name = name; this.codecType = name.substring(name.indexOf(".") + 1); } public String getCodecType() { return codecType; } public String getName() { return name; } } public interface Codec { } public class MPEG4CompressionCodec implements Codec { public String type = "mp4"; } public class OggCompressionCodec implements Codec { public String type = "ogg"; } public class CodecFactory { public static Codec extract(VideoFile file) { String type = file.getCodecType(); if (type.equals("mp4")) { System.out.println("CodecFactory: extracting mpeg audio..."); return new MPEG4CompressionCodec(); } else { System.out.println("CodecFactory: extracting ogg audio..."); return new OggCompressionCodec(); } } } public class BitrateReader { public static VideoFile read(VideoFile file, Codec codec) { System.out.println("BitrateReader: reading file..."); return file; } public static VideoFile convert(VideoFile buffer, Codec codec) { System.out.println("BitrateReader: writing file..."); return buffer; } } public class AudioMixer { public File fix(VideoFile result){ System.out.println("AudioMixer: fixing audio..."); return new File("tmp"); } }
Facade
public class VideoConversionFacade { public File convertVideo(String fileName, String format) { System.out.println("VideoConversionFacade: conversion started."); VideoFile file = new VideoFile(fileName); Codec sourceCodec = CodecFactory.extract(file); Codec destinationCodec; if (format.equals("mp4")) { destinationCodec = new MPEG4CompressionCodec(); } else { destinationCodec = new OggCompressionCodec(); } VideoFile buffer = BitrateReader.read(file, sourceCodec); VideoFile intermediateResult = BitrateReader.convert(buffer, destinationCodec); File result = (new AudioMixer()).fix(intermediateResult); System.out.println("VideoConversionFacade: conversion completed."); return result; } }
Client
public class Client { public static void main(String[] args) { VideoConversionFacade converter = new VideoConversionFacade(); File mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4"); } } # 결과 VideoConversionFacade: conversion started. CodecFactory: extracting ogg audio... BitrateReader: reading file... BitrateReader: writing file... AudioMixer: fixing audio... VideoConversionFacade: conversion completed.
적용
- 복잡한 하위 시스템에 대한 제한적이지만 간단한 인터페이스가 필요한 경우
- 하위 시스템을 계층들로 구성하려는 경우
장단점
장점
- 복잡한 하위 시스템에서 코드를 별도로 분리할 수 있다.
단점
- 퍼사드는 앱의 모든 클래스에 결합된 전지전능한 객체가 될 수 있다.
참고
'STUDY > 디자인패턴' 카테고리의 다른 글
Proxy Pattern(프록시 패턴) (0) 2025.01.07 Flyweight Pattern(플라이웨이트 패턴) (0) 2025.01.07 Decorator Pattern(데코레이터 패턴) (0) 2024.12.25 Composite Pattern(복합체 패턴) (0) 2024.12.25 Bridge Pattern(브리지 패턴) (0) 2024.12.08