유니티 Facade 패턴에 대해 알아보자

출처 - https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%82%AC%EB%93%9C

Facade 패턴은 복잡한 시스템을 단순화하여 쉽게 사용할 수 있도록 하는 디자인 패턴입니다. 위 사진처럼 거대한 건물 뒤에 부분은 보이지 않는 것처럼, 퍼사드 패턴을 통해 뒤에서 일어나는 것들이 무엇이 있는지 알 필요 없이 사용하기 쉽게 만드는데 초점을 두는 패턴이라고생각하시면 됩니다.      


Facade 패턴의 개념

Facade 패턴은 복잡한 서브시스템들을 단순화하여, 클라이언트가 하나의 인터페이스만으로 시스템을 조작할 수 있게 해줍니다. 여러 객체와 클래스들이 상호작용하여 시스템이 구성될 때, Facade 클래스가 이를 조정하여 하나의 간단한 API로 제공합니다.

 

퍼사드 패턴은 다음과 같은 경우에 사용하면 좋습니다.   

  1. 복잡한 코드 구조를 숨기고 간단한 인터페이스를 제공하고자 할 때
  2. 클라이언트 코드가 여러 하위 시스템과의 직접적인 상호작용을 줄여 유지보수성을 높이고자 할 때

아래에 예시와 함께 알아보겠습니다. 


캐릭터 시스템 간소화

캐릭터 시스템을 예로 들어보겠습니다. 캐릭터 시스템은 다양한 서브시스템(예: 이동, 공격, 방어)을 포함할 수 있습니다. Facade 패턴을 사용하여 이 서브시스템들을 단일 인터페이스로 제공해 캐릭터의 동작을 쉽게 조작해보겠습니다.

1. 서브시스템 구현

우선 각 기능을 담당하는 서브시스템 클래스들을 정의해보겠습니다. Movement, Attack, Defense 클래스를 만들어 캐릭터의 이동, 공격, 방어 기능을 분리합니다.

// 이동 시스템
public class Movement
{
    public void Move(Vector3 direction)
    {
        Debug.Log($"Moving in direction: {direction}");
    }
}

// 공격 시스템
public class Attack
{
    public void ExecuteAttack()
    {
        Debug.Log("Executing attack!");
    }
}

// 방어 시스템
public class Defense
{
    public void Block()
    {
        Debug.Log("Blocking attack!");
    }
}

이렇게 서브시스템이 분리되어 있으면 클라이언트 코드에서는 각 시스템을 직접 호출해야 하므로, 캐릭터를 조작하는 코드가 복잡해질 수 있습니다. 이를 Facade 패턴을 사용해 간단하게 만들어보겠습니다.


2. Facade 클래스 구현

모든 기능을 하나의 간단한 인터페이스로 제공하는 CharacterFacade 클래스를 작성합니다. 이 클래스는 이동, 공격, 방어 기능을 포함한 서브시스템들을 하나로 묶어 클라이언트가 간단하게 캐릭터를 조작할 수 있도록 합니다.

public class CharacterFacade
{
    private Movement _movement;
    private Attack _attack;
    private Defense _defense;

    public CharacterFacade()
    {
        _movement = new Movement();
        _attack = new Attack();
        _defense = new Defense();
    }

    public void MoveCharacter(Vector3 direction)
    {
        _movement.Move(direction);
    }

    public void AttackEnemy()
    {
        _attack.ExecuteAttack();
    }

    public void Defend()
    {
        _defense.Block();
    }
}

CharacterFacade 클래스는 Movement, Attack, Defense와 같은 서브시스템을 포함하고 있으며, 각 서브시스템을 호출하는 간단한 메서드를 제공합니다. 이제 클라이언트는 복잡한 코드 없이 단순히 CharacterFacade의 메서드만 호출하면 됩니다.


3. 사용 예시

using UnityEngine;

public class FacadeExample : MonoBehaviour
{
    private CharacterFacade _character;

    void Start()
    {
        _character = new CharacterFacade();

        // 캐릭터를 이동시키기
        _character.MoveCharacter(new Vector3(1, 0, 0));

        // 캐릭터가 공격하기
        _character.AttackEnemy();

        // 캐릭터가 방어하기
        _character.Defend();
    }
}