구조 (Structure) 패턴
구조 패턴 이란 객체 간의 상호 작용에 대한 구조적 관계를 명확히 정의하여, 코드의 유연성과 재사용성을 높이는 디자인 패턴
주요 패턴으론 다음 사항들이 있다.
- 어댑터 (Adapter)
- 데코레이터(Decorator)
- 복합자(Composite)
- 파셔드(Facade) <- 이번 글에서 다룰 내용
- 플라이웨잇(Flyweight)
- 프록시(Proxy)
- 브릿지(Bridge)
파서드 (Facade) 패턴 이란
복잡한 클래스 세트/하위 시스템에 대해 클라이언트 에게 단순화 된 인터페이스를 제공하는 구조적 디자인 패턴
아래 그림과 같이 안에는 복잡하지만, 최종 바깥 문 (=단순화된 인터페이스)를 제공하는 것
주로 다음 경우에 많이 사용된다.
- 복잡한 하위 시스템에 대한 제한적이지만 간단한 인터페이스가 필요한 경우
- 하위 시스템을 레이어로 구성하려고 할 때, Facade를 사용
등장 배경
ex) 외부 라이브러리/프레임워크에 속하는 다양한 객체들을 사용하는 경우, 해당 객체를 모두 초기화 하고, 종속성을 추적해야 됨.
여기서 종속성을 추적하는 것이란, 올바른 순서로 객체를 초기화해서 메서드를 실행했고, 라이브러리 코드 실행 간 논리상 문제가 될 만한 부분이 없는 지 등을 체크하는 것
구조
- Client는 Facade 객체의 linksToSubSystemObjects를 통해 하위 서브 시스템 모듈에 접근한다.
- Facade는 기본적으로 어떤 요청에 어떤 서브시스템으로 보내야 하는지 알고 있다.
- Facade는 서브시스템 외에도 optionalAdditionalFacade() 함수를 통해 다른 Additional Facade로 연결할 수도 있다.
요약하면 클라이언트는 Facade를 통해 하위 시스템 객체들을 직접 호출하지 않는 다는 것
PseudoCode
VideoConvert 라는 Facade 객체가 있음
convertVideo라는 비디오 변환의 목적을 가진 함수가 호출되면, 하위의 다양한 Subsystem 과정 등을 거쳐야 함
다음 예제 Pseudo Code 처럼 서브 시스템의 복잡한 과정을 Video Converter 라는 Facade 객체로 감추고 쉽게 사용 될 수 있게 함
class VideoFile
class OggCompressionCodec
class MPEG4CompressionCodec
class CodecFactory
class BitrateReader
class AudioMixer
class VideoConverter
method convertVideo(filename, format)
file = new VideoFile(filename)
if (format == "mp4")
destinationCodec = new MPEG4CompressionCodec()
buffer = BitrateReader.read(filename, sourceCodec)
result = (new AudioMixer()).fix(result)
return new File(result)
class Application is
method main() is
convertor = new VideoConverter()
mp4 = convertor.convertVideo("funny-cats-video.ogg", "mp4")
mp4.save()
장단점
- 하위 시스템의 복잡성으로부터 코드를 분리
- 파사드는 하나 둘 엮다 보면, 앱의 모든 클래스와 결합된 신(god) 객체가 될 수 있습니다.
다른 패턴과의 관계
vs (구조 패턴) Adapter
- Adapter : 일반적으로 하나의 객체만 래핑 + 기존의 인터페이스를 사용 할수 있도록 맞추는 것
- Facade : 객체의 전체 하위 시스템과 함께 작동하며, 기존 객체에 대한 새로운 인터페이스를 정의
vs (생성 패턴) Abstract Factory
- 하위 시스템 개체가 생성되는 방식만 숨기려는 경우 Facade 의 대안으로 사용 가능
vs (구조 패턴) Flyweight
- Flyweight : 작은 개체를 많이 만드는 방법을 보여주는 방법
- Facade : 전체 하위 시스템을 나타내는 단일 객체를 만드는 방법
vs (구조 패턴) Mediator
- Facade와 Mediator는 비슷한 역할로, 밀접하게 결합된 많은 (서브)클래스 간의 협업을 조직하는 역할을 수행
- Facade : 서브시스템의 복잡성을 숨기고 단순한 인터페이스 제공 목적 (클라이언트가 Facade를 통해 서브시스템과 상호작용)
- Mediator : 객체 간 복잡한 상호작용을 중앙 집중화 하여 단순화(only mediator) 하고, 의존성을 줄이고자 하는 목적 (객체들이 Mediator를 통해서만 상호작용)
vs 데코레이터, 어댑터, 퍼사드
- 어댑터 : 하나의 인터페이스를 다른 인터페이스로 변환
- 데코레이터 : 인터페이스는 바꾸지 않고, 책임(기능)만 추가
- 퍼사드 : 인터페이스를 보다 간단하게 변경
'소프트웨어 개발자 > 디자인패턴' 카테고리의 다른 글
[디자인 패턴] 구조 패턴 - 복합자 패턴 (1) | 2024.06.08 |
---|---|
[디자인 패턴] 구조 패턴 - 데코레이터 패턴 (1) | 2024.06.08 |
[디자인 패턴] 구조 패턴 - 어댑터 패턴 (1) | 2024.06.08 |
[디자인패턴] 행동 패턴 - 상태(State) 패턴 (0) | 2024.05.04 |
[디자인패턴] 행동 패턴 - 전략(Strategy) 패턴 (0) | 2024.05.04 |