[TIL] Design Patterns Structural Pattern (구조 패턴), Facade Pattern

Dreamer·2024년 10월 1일

1. 오늘 주제

오늘은 딱히 떠오르는 주제가 없어서 이전에 정리했던 Design Patterns에 대한 설명을 이어가보려고 한다. 마찬가지로 흔한 Patterns을 한번에 다 하는 것은 아니고, 게임 개발에서 주로 사용하는 Pattern에 대해 작성할 예정이다.
그럼 이번에 작성할 Pattern은 Facade Pattern으로 소프트웨어에서 복잡한 서브시스템을 간단한 인터페이스로 Wrapping 하여 외부에서 쉽게 사용할 수 있도록 해주는 패턴을 다루어 본다.

2. Facade Pattern

한국말로 하면 파사드 패턴이라고도 하고 사용 용도는 다음과 같다.

  • 복잡한 시스템을 사용하고 있지만, 간단한 인터페이스만 필요할 때
  • 복잡한 하위 시스템의 구성 요소들 간의 의존성을 최소화하고 싶을 때
  • 클라이언트가 서브시스템을 알 필요 없이 단순한 인터페이스를 통해 시스템을 이용하게 하고 싶을 때
    단순하게 생각하면 하나의 컨텐츠에서 컨텐츠에 필요한 기능들을 일괄로 작동하게 끔 해주는 방법이라고 생각하면 쉽다.
    소스코드를 예시로 들어보자.
// 서브 시스템 1: 엔진
class Engine
{
    public void Start() => Console.WriteLine("엔진이 시동되었습니다.");
    public void Stop() => Console.WriteLine("엔진이 꺼졌습니다.");
}

// 서브 시스템 2: 라이트
class Lights
{
    public void TurnOn() => Console.WriteLine("라이트가 켜졌습니다.");
    public void TurnOff() => Console.WriteLine("라이트가 꺼졌습니다.");
}

// 서브 시스템 3: 브레이크
class Brakes
{
    public void Apply() => Console.WriteLine("브레이크가 작동 중입니다.");
    public void Release() => Console.WriteLine("브레이크가 해제되었습니다.");
}

// 서브 시스템 4: 연료 시스템
class FuelSystem
{
    public void InjectFuel() => Console.WriteLine("연료가 주입되고 있습니다.");
    public void StopFuelInjection() => Console.WriteLine("연료 주입이 중단되었습니다.");
}

// Facade 클래스: CarFacade
class CarFacade
{
    private Engine _engine;
    private Lights _lights;
    private Brakes _brakes;
    private FuelSystem _fuelSystem;

    public CarFacade()
    {
        _engine = new Engine();
        _lights = new Lights();
        _brakes = new Brakes();
        _fuelSystem = new FuelSystem();
    }

    // 자동차 시동 및 주행 준비
    public void StartCar()
    {
        Console.WriteLine("자동차를 시작합니다...");
        _lights.TurnOn();
        _fuelSystem.InjectFuel();
        _engine.Start();
        _brakes.Release();
        Console.WriteLine("자동차 주행 준비 완료!");
    }

    // 자동차 주행 중지
    public void StopCar()
    {
        Console.WriteLine("자동차를 정지합니다...");
        _brakes.Apply();
        _engine.Stop();
        _fuelSystem.StopFuelInjection();
        _lights.TurnOff();
        Console.WriteLine("자동차가 정지되었습니다.");
    }
}

// 사용 예시
class Program
{
    static void Main(string[] args)
    {
        CarFacade car = new CarFacade();

        // 간단하게 자동차 시작과 정지
        car.StartCar();
        Console.WriteLine("자동차를 운전 중...");
        car.StopCar();
    }
} 

이런식으로 사용하고 결과를 보면

자동차를 시작합니다...
라이트가 켜졌습니다.
연료가 주입되고 있습니다.
엔진이 시동되었습니다.
브레이크가 해제되었습니다.
자동차 주행 준비 완료!
자동차를 운전 중...
자동차를 정지합니다...
브레이크가 작동 중입니다.
엔진이 꺼졌습니다.
연료 주입이 중단되었습니다.
라이트가 꺼졌습니다.
자동차가 정지되었습니다.

자동차의 시동을 걸면 거기에 부수적인 기능들이 일괄적으로 작동하는 형식으로 진행되도록 한다. 따라서 복잡한 내부 동작을 감추고 클라이언트가 간단하게 사용할 수 있도록 할 수 있게 된다.

정리 하자면 Facade Pattern을 잘 활용하면 다음과 같은 장점을 누릴 수 있다.

  • 간단한 인터페이스: 복잡한 내부 동작을 감추고, 클라이언트가 간단하게 사용할 수 있도록 돕습니다.
  • 코드의 유지보수 용이성: 서브시스템이 변경되어도 Facade만 수정하면 되므로 유지보수가 용이합니다.
  • 의존성 감소: 클라이언트가 서브시스템에 직접적으로 의존하지 않으므로 코드의 결합도를 낮출 수 있습니다.
profile
새로운 시작

0개의 댓글