퍼사드 패턴
- 퍼사드는 움직이는 부분이 많이 포함된 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하는 클래스
- 주어진 서브시스템의 일반적인 기능에 대한 단순화된 하나의 인터페이스를 제공
- 하위 시스템과 직접 작업하는 것과 비교하면 퍼사드는 제한된 기능성을 제공
- 퍼사드에는 클라이언트들이 정말로 중요하게 생각하는 기능들만 포함
활용성
- 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
- 패턴 적용시 작은 단위로 객체가 만들어지기 때문에 서브시스템을 재사용 가능하게도 할 수 있다.
- 추상 개념에 대한 구현과 사용자 사이에 많은 종속성이 존재할 때 퍼사드 사용을 통해 다른 시스템과 결합도를 줄일 수 있다.
- 서브시스템의 계층화를 할 때 각 서브시스템의 계층에 대한 접근점을 제공한다.
- 이것도 마찬가지로 호출되는 부분이 줄어듬으로 종속성이 줄어든다.
구조
요소
- 퍼사드
- 사용자의 요청을 서브시스템 객체에 전달하는 단순하고 일관된 통합 인터페이스
- 서브 클래스들
- Facade에 대한 정보를 가지지 않고, 서브시스템의 기능을 구현하는 클래스
협력 방법
- 사용자는 Facade에 정의된 인터페이스를 사용
- Facade는 요청을 내부에 있는 서브시스템에 전달.
- 서브시스템은 요청 처리
장점
- 서브시스템의 구성요소를 보호할 수 있다.
- 서브시스템과 사용자 코드 간의 결합도를 더욱 약하게 만듬.
- 서브시스템 내 정의된 요소들은 강하게 결합될 수 있다.
단점
- 퍼사드는 앱의 모든 클래스에 결합된 전지전능한 객체가 될 수 있다.
예시 코드
참고
import UIKit
struct Indicator {
func start() {
print("start indicator")
}
func stop() {
print("stop indicator")
}
}
protocol LoadingFacade {
var coveredView: UIView { get }
var indicator: Indicator { get }
func startLoading()
func stopLoading()
}
final class LodingView: LoadingFacade {
private(set) var coveredView: UIView
private(set) var indicator: Indicator
init(coveredView: UIView, indicator: Indicator) {
self.coveredView = coveredView
self.indicator = indicator
}
func startLoading() {
coveredView.isHidden = false
indicator.start()
}
func stopLoading() {
coveredView.isHidden = true
indicator.stop()
}
}
let loadingView: LoadingFacade = LodingView(coveredView: UIView(), indicator: Indicator())
loadingView.startLoading()
loadingView.stopLoading()