퍼사드 패턴

Groot·2023년 12월 10일
0

TIL

목록 보기
143/148
post-thumbnail

퍼사드 패턴

  • 퍼사드는 움직이는 부분이 많이 포함된 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하는 클래스
  • 주어진 서브시스템의 일반적인 기능에 대한 단순화된 하나의 인터페이스를 제공
  • 하위 시스템과 직접 작업하는 것과 비교하면 퍼사드는 제한된 기능성을 제공
  • 퍼사드에는 클라이언트들이 정말로 중요하게 생각하는 기능들만 포함

활용성

  • 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
    • 패턴 적용시 작은 단위로 객체가 만들어지기 때문에 서브시스템을 재사용 가능하게도 할 수 있다.
  • 추상 개념에 대한 구현과 사용자 사이에 많은 종속성이 존재할 때 퍼사드 사용을 통해 다른 시스템과 결합도를 줄일 수 있다.
    • 호출을 단순화 하고 내부를 처리하기 때문에
  • 서브시스템의 계층화를 할 때 각 서브시스템의 계층에 대한 접근점을 제공한다.
    • 이것도 마찬가지로 호출되는 부분이 줄어듬으로 종속성이 줄어든다.

구조

요소

  • 퍼사드
    • 사용자의 요청을 서브시스템 객체에 전달하는 단순하고 일관된 통합 인터페이스
  • 서브 클래스들
    • 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()
profile
I Am Groot

0개의 댓글