본문 바로가기
Unity/Engine

옵저버 패턴(ObserverPattern)

by 잡템 2022. 2. 25.

옵저버 패턴이란 객체의 상태 변화를 관찰자(옵저버) 목록을 특정 객체(Subject)에 등록하여 옵저버의 상태변화가 있을때 마다 Subject에서 목록의 옵저버에게 통지하도록 하는 1:N 구조의 디자인패턴이다.

 

주로 이벤트 핸들링 시스템을 구현하는데 사용된다 하며 많이쓰는 패턴인거같아 간단하게 구현해보았다.

 

리스트를 사용하는방법과 델리게이트를 사용하여 구현하는방법이있으며 나는 후자의 방법으로 구현하였다.

public abstract class Observer : MonoBehaviour
{
    public abstract void Notify();
}

옵저버 베이스 코드, 상속과 재정의를 위해 추상클래스로 구성했으며 인터페이스로 구성해도 상관없다.

 

public class KeySubject : MonoBehaviour
{
    public delegate void KeyNotification();

    event KeyNotification keyNotification;

    public int NextKey;

    static KeySubject _instance;

    public static KeySubject Instance
    {
        get => _instance;
    }

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
        }
        else if (_instance != null)
        {
            Destroy(this.gameObject);
        }
    }

    public void Add(KeyNotification noti)
    {

        keyNotification += noti;
    }

    public void Remove(KeyNotification noti)
    {
        keyNotification -= noti;
    }

    public void ObserverUpdate()
    {
        keyNotification();
        NextKey++;
    }

}

테스트용 Subject 코드 옵저버쪽 Start에서 이벤트 등록을 위해 싱글톤으로 구성함.

public class KeyObserver : Observer
{
    public int num;


    private void Start()
    {
        KeySubject.Instance.Add(Notify);
        gameObject.SetActive(false);
    }

    //해당옵저버에서 동작할 함수
    public override void Notify()
    {
        if (num.Equals(KeySubject.Instance.NextKey))
        {
            gameObject.SetActive(true);
        }
        else
            gameObject.SetActive(false);
    }
}

테스트용 옵저버 코드 Subject에서 숫자를받아 해당하는 오브젝트만 활성화하도록 구현 

 

결과 Subject에서 NextKey를 받아 옵저버를 업데이트 시킬때마다 노출되는 오브젝트가 달라진다.

'Unity > Engine' 카테고리의 다른 글

[Unity]Action vs UnityAction  (0) 2023.08.15
디바이스별 그래픽 API  (0) 2022.04.10
Vector3 Roatation(벡터 회전)  (0) 2022.02.16
유니티 특정 디렉토리 파일 불러오기  (0) 2022.02.14
코루틴 매니저  (0) 2022.02.09