본문 바로가기

Unity/Unity 스파르타

디자인 패턴에 대한 고찰(2) - 옵저버

728x90

옵저버 패턴에 대해 알아보고 고찰해보자..

 

옵저버 패턴은 객체 간의 일대다 의존성을 정의하는 디자인 패턴입니다. 이 패턴은 한 객체의 상태 변화가 다른 객체들에게 자동으로 알려지고, 이에 따라 관련된 객체들이 업데이트될 수 있도록 하는데 사용됩니다.

그렇기 때문에 항상 접근 방향에 대한 고민이 필요 합니다.

 

매니저급 클래스에서 특정 개체의 상태를 계속 체크하고, 상태가 변했을때 옵저버에게 전달하는, 

주체에서 옵저버를 향한 접근방향의 경우 옵저버가 삭제되거나, 로직이 변경됬을 경우 매니저 클래스 또한 그에 맞게 로직을 변경해야하는 경우가 발생할 수 있습니다.

때문에 옵저버에서 주체를 향한 접근방식이여야 좀 더 번거로운 과정을 줄일 수 있습니다.

 

1. 옵저버 인터페이스를 상태를 확인해야하는 개체에 상속 시킵니다.

2. 옵저버 인터페이스를 가지고 있는 개체를 확인해 해당 클래스를 리스트로 담아내는 인터페이스 클래스를 작성합니다.

3. 주체에서는 2번을 상속 받아 옵저버 개체를 리스트로 받아 관리 합니다.

이렇게 하면 옵저버에서 주체에 접근해 2번 인터페이스를 사용해 주체에 옵저버를 리스트에 담아 주게 됩니다.

 

하지만 우리에겐 델리게이트가 존재 함으로 이를 사용해 아주 쉽게 옵저버 패턴을 구현할 수 있습니다.

 

public class Subject : MonoBehaviour
{
    public static Subject instance;

    private void Awake()
    {
        instance = this;
    }

    // 옵저버들을 저장할 리스트
    private List<Action> observers = new List<Action>();

    // 주체의 상태 변화를 알리는 메서드
    public void NotifyObservers()
    {
        foreach (Action observer in observers)
        {
            observer.Invoke();
        }
    }

    // 옵저버 등록 메서드
    public void RegisterObserver(Action observer)
    {
        observers.Add(observer);
    }

    // 옵저버 제거 메서드
    public void RemoveObserver(Action observer)
    {
        observers.Remove(observer);
    }
}

public class Observer : MonoBehaviour
{
    private void Start()
    {
        Subject.instance.RegisterObserver(OnSubjectStateChanged);
    }

    // 주체의 상태 변화에 대한 처리
    private void OnSubjectStateChanged()
    {
        Debug.Log("주체의 상태가 변했습니다!");
    }
}
728x90