TIL(2024,08,29)옵저버 패턴 (Observer Pattern) 과 상태 패턴의 연계 가능성

김보근·2024년 8월 29일

Unity

목록 보기
73/113
post-thumbnail

TIL: 옵저버 패턴과 상태 패턴의 연계 가능성

옵저버 패턴

오늘은 옵저버 패턴(Observer Pattern)에 대해 공부했다. 옵저버 패턴은 주체(Subject)의 상태가 변할 때, 이를 자동으로 옵저버(Observer)들에게 통지하는 패턴이다. 이 패턴을 통해 여러 객체 간의 상태를 동기화할 수 있으며, 이벤트 기반 시스템에서 매우 유용하다.

나의 생각 : 상태 패턴과의 연계 가능성

옵저버 패턴을 이해하면서 한 가지 흥미로운 생각이 들었다. 바로 상태 패턴(State Pattern)과의 연계 가능성이다.

  • 상태 패턴은 객체의 상태에 따라 행동을 변경하는 패턴인데, 이 패턴을 사용하면 객체의 상태를 객체 내부에서 관리하고, 상태 변화에 따라 다양한 동작을 수행할 수 있다.
  • 반면에 옵저버 패턴은 상태 변화가 발생할 때 다른 객체들에게 이를 통지하는 역할을 한다.
// 상태 패턴의 상태 인터페이스
public interface IState
{
    void Handle(Player player); // 상태에 따라 Player 객체의 행동을 정의하는 메서드
}

// 구체적인 상태 클래스들
public class NormalState : IState
{
    public void Handle(Player player)
    {
        Console.WriteLine("Player is in Normal state."); // Normal 상태에서의 행동 정의
    }
}

// 주체(Subject) 클래스
public class Player
{
    private List<IObserver> observers = new List<IObserver>(); // 옵저버 목록을 저장하는 리스트
    private IState state; // 현재 Player의 상태를 나타내는 변수

    public void SetState(IState newState)
    {
        state = newState; // Player의 상태를 새로운 상태로 설정
        Notify(); // 상태가 변경되면 옵저버들에게 알림
    }

    public void Attach(IObserver observer)
    {
        observers.Add(observer); // 옵저버를 등록하는 메서드
    }

    private void Notify()
    {
        foreach (var observer in observers) // 등록된 모든 옵저버들에게
        {
            observer.Update(); // 상태 변경을 알리는 메서드 호출
        }
    }
}

// 옵저버 인터페이스
public interface IObserver
{
    void Update(); // 상태 변경 시 호출되는 메서드
}

// HealthBar UI 옵저버
public class HealthBarUI : IObserver
{
    public void Update()
    {
        Console.WriteLine("Health Bar Updated."); // 상태 변경 시 Health Bar UI를 업데이트
    }
}

생각 : 상태 패턴과 옵저버 패턴의 조합

옵저버 패턴을 공부하다 보니, 상태 패턴과 연계하여 사용할 수 있겠다는 생각이 들었다. 예를 들어, 게임 캐릭터의 체력에 따라 상태(정상, 부상, 사망)가 변화하는 상황에서 상태 패턴을 사용하고, 이 상태 변화가 다른 시스템(예: UI, 애니메이션, 게임 오버 처리 등)에게 자동으로 통지되어야 할 경우, 옵저버 패턴을 활용할 수 있을 것 같다.

즉, 상태 패턴을 통해 객체의 상태를 관리하고, 그 상태 변화가 발생할 때마다 옵저버 패턴을 통해 관련된 모든 객체가 그 변화에 대응하도록 할 수 있는 것이다. 이렇게 하면 시스템 간의 결합도를 낮추면서도, 각 시스템이 서로 독립적으로 상태 변화에 반응할 수 있다.

결론

옵저버 패턴을 통해 이벤트를 처리하는 방식을 이해하면서, 상태 패턴과 결합하여 다양한 상황에 유연하게 대응할 수 있는 설계를 할 수 있겠다는 생각이 들었다. 앞으로 이 패턴들을 게임 개발이나 다른 프로젝트에 적용해보면서, 더 깊이 이해하고 활용할 수 있도록 연습해야겠다.

이러한 상태패턴은 어느 패턴이든지 이렇게 잘어울리고 다양한 요구사항을 만족시키는 강력하고 좋은 패턴임을 다시금 깨닫게 되었다.

어디든지쓰이네..

profile
게임개발자꿈나무

0개의 댓글