오늘은 딱히 떠오르는 주제가 없어서 이전에 정리했던 Design Patterns에 대한 설명을 이어가보려고 한다. 마찬가지로 흔한 Patterns을 한번에 다 하는 것은 아니고, 게임 개발에서 주로 사용하는 Pattern에 대해 작성할 예정이다.
그럼 이번에 작성할 Pattern은 Facade Pattern으로 소프트웨어에서 복잡한 서브시스템을 간단한 인터페이스로 Wrapping 하여 외부에서 쉽게 사용할 수 있도록 해주는 패턴을 다루어 본다.
한국말로 하면 파사드 패턴이라고도 하고 사용 용도는 다음과 같다.
// 서브 시스템 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을 잘 활용하면 다음과 같은 장점을 누릴 수 있다.