
오늘은 옵저버 패턴(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, 애니메이션, 게임 오버 처리 등)에게 자동으로 통지되어야 할 경우, 옵저버 패턴을 활용할 수 있을 것 같다.
즉, 상태 패턴을 통해 객체의 상태를 관리하고, 그 상태 변화가 발생할 때마다 옵저버 패턴을 통해 관련된 모든 객체가 그 변화에 대응하도록 할 수 있는 것이다. 이렇게 하면 시스템 간의 결합도를 낮추면서도, 각 시스템이 서로 독립적으로 상태 변화에 반응할 수 있다.
옵저버 패턴을 통해 이벤트를 처리하는 방식을 이해하면서, 상태 패턴과 결합하여 다양한 상황에 유연하게 대응할 수 있는 설계를 할 수 있겠다는 생각이 들었다. 앞으로 이 패턴들을 게임 개발이나 다른 프로젝트에 적용해보면서, 더 깊이 이해하고 활용할 수 있도록 연습해야겠다.
이러한 상태패턴은 어느 패턴이든지 이렇게 잘어울리고 다양한 요구사항을 만족시키는 강력하고 좋은 패턴임을 다시금 깨닫게 되었다.
어디든지쓰이네..