Facade 패턴은 복잡한 시스템을 단순화하여 쉽게 사용할 수 있도록 하는 디자인 패턴입니다. 위 사진처럼 거대한 건물 뒤에 부분은 보이지 않는 것처럼, 퍼사드 패턴을 통해 뒤에서 일어나는 것들이 무엇이 있는지 알 필요 없이 사용하기 쉽게 만드는데 초점을 두는 패턴이라고생각하시면 됩니다.
Facade 패턴의 개념
Facade 패턴은 복잡한 서브시스템들을 단순화하여, 클라이언트가 하나의 인터페이스만으로 시스템을 조작할 수 있게 해줍니다. 여러 객체와 클래스들이 상호작용하여 시스템이 구성될 때, Facade 클래스가 이를 조정하여 하나의 간단한 API로 제공합니다.
퍼사드 패턴은 다음과 같은 경우에 사용하면 좋습니다.
- 복잡한 코드 구조를 숨기고 간단한 인터페이스를 제공하고자 할 때
- 클라이언트 코드가 여러 하위 시스템과의 직접적인 상호작용을 줄여 유지보수성을 높이고자 할 때
아래에 예시와 함께 알아보겠습니다.
캐릭터 시스템 간소화
캐릭터 시스템을 예로 들어보겠습니다. 캐릭터 시스템은 다양한 서브시스템(예: 이동, 공격, 방어)을 포함할 수 있습니다. 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();
}
}