디자인 패턴 중 Facade 패턴에 대해 설명합니다.
개념
복잡한 서브 시스템의 일부 기능을 캡슐화하여 심플한 인터페이스로 제공하는 패턴입니다. 라이브러리, 프레임워크등과 같이 복잡한 객체들을 사용하는 서브 시스템을 사용할 경우 기능에 필요한 객체들 생성, 객체 간 의존성 해결, 올바른 순서의 메소드 호출, 파라미터에 사용될 데이터 포맷 지키기 등의 과정이 요구됩니다. 이를 코드에 적용하면 비즈니스 로직과 강한 결합이 생기고 코드가 복잡해져 유지보수가 어려워질 수 있습니다. 서브 시스템에서 클라이언트가 필요로 하는 기능을 제한하여 인터페이스로 제공하는 것이 Facade 패턴입니다.
- Facade: 복잡한 여러 서브시스템을 클라이언트가 직접 사용할 필요 없도록 캡슐화하여 특정 기능에 대한 인터페이스를 제공합니다.
- AdditionalFacade: Facade 객체가 너무 복잡해질 경우 추가적인 Facade 객체를 생성할 수 있습니다. Facade 객체 혹은 클라이언트에서 AdditionalFacade를 다룹니다.
- Subsystem: 메인 시스템에서 사용하는 어떠한 복잡한 클래스 집합의 시스템입니다.
- Client: 서브시스템을 직접 다루지 않고 Facade를 통해서만 기능을 사용합니다.
다음과 같은 장점이 있습니다.
- 복잡한 서브 시스템 기능을 캡슐화하고 인터페이스로 제공하여 비즈니스 로직과 결합도가 낮아집니다.
- 서브 시스템 교체, 버전에 따른 수정이 필요한 경우 Facade 객체만 수정하면 되므로 서브시스템에 대한 의존도가 낮아집니다.
- Facade 객체를 통해 쉽게 서브 시스템 기능을 사용할 수 있어 재사용성이 높아집니다.
- Single Responsibility Principle: 서브 시스템 기능을 Facade로 분리하여 클라이언트는 비즈니스 로직에 집중할 수 있습니다.
적용 예시
사용자가 컴퓨터(Facade)를 통해 내부 부품에 접근할 필요없이 실행하는 추상적인 예제입니다.
class CPU:
def execute(self): ...
class Memory:
def load(self, address, data): ...
class HardDrive:
def read(self, sector, size): ...
class Computer:
"""Facade"""
BOOT_ADDRESS = ...
BOOT_SECTOR = ...
SECTOR_SIZE = ...
def run(self):
cpu = CPU()
memory = Memory()
hardDrive = HardDrive()
memory.load(self.BOOT_ADDRESS, hardDrive.read(self.BOOT_SECTOR, self.SECTOR_SIZE))
cpu.execute()
Computer.run()
클라이언트는 서브 시스템에 접근할 필요 없이 Computer를 통해 손쉽게 원하는 결과를 얻을 수 있습니다.
참조
'객체 지향 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - Proxy (0) | 2023.10.29 |
---|---|
디자인 패턴 - Flyweight (0) | 2023.10.28 |
디자인 패턴 - Decorator (1) | 2023.10.25 |
디자인 패턴 - Composite (0) | 2023.10.22 |
디자인 패턴 - Bridge (0) | 2023.10.21 |