본문 바로가기

프로그래밍/디자인패턴

Observer (옵저버)

728x90
반응형

일반적으로 옵저버 패턴을 설명할 때 이러한 이야기를 한다.

'어떤 연예인이 있는데 연예인의 주변을 둘러쌓는 팬들을 떠올리면 된다. 연예인은 팬들이 누군지 한명한명 알 필요는 없지만 말을 하거나 노래를 부르면서 모든 팬들에게 자신의 의사를 전달할 수 있다.' 여기서 연예인은 주체가 되고 팬들은 옵저버가 된다.

현재 우리 프로젝트에서 내가 만든 핫타임이 옵저버를 이용해서 만들어졌다.

ModelHotTime

- 핫타임 정보를 가지고 있다.

ControllerHotTime

- 이벤트를 관리하는 컨트롤러

UnitHotTimeMark

- 핫타임 이벤트임을 나타내는 아이콘

- 대전모드, 싱글모드 등 각 버튼에 하나씩 붙어있다.

예시1) 대전모드 핫타임 이벤트가 종료되고 싱글모드 핫타임만 남았다.

1. ControllerHotTime에서 대전모드 핫타임 이벤트가 종료되었으면 옵저버에게 CallBack을 보낸다.

2. 대전모드에 있는 UnitHotTimeMark는 CallBack을 받아 아이콘을 비활성화 시킨다.

3. 싱글모드에 있는 UnitHotTimeMark는 CallBack을 받았지만 이벤트가 종료되지 않았기에 아이콘을 유지한다.

예시2)

public enum HotTimeMessage

{

ScheduleStart = 0

ScheduleEnd = 1,

}

public struct Telegram

{

public HotTimeMessage message;

public object[] data;

}

interface IHandleMessage

{

void HandleMessage(Telegram telegram);

}

public class UnitHotTimeMark : IHandleMessage

{

[SerializeField]

private GameObject hotTimeIcon;

void OnEnable()

{

// 오브젝트가 켜지면 옵저버를 등록한다.

ObserverManager.AddObserver(this, HotTimeMessage.ScheduleStart);

ObserverManager.AddObserver(this, HotTimeMessage.ScheduleEnd);

}

void OnDisable()

{

// 오브젝트가 꺼지면 옵저버를 지운다.

ObserverManager.RemoveObserver(this);

}

void HandleMessage(Telegram telegram)

{

switch (telegram.hotTimeMessage)

{

case HotTimeMessage.ScheduleStart:

{

// 이벤트 시작 여부에 따라 행동

}

break;

case HotTimeMessage.ScheduleEnd:

{

// 이벤트 종료 여부에 따라 행동

// ObjectToEndSchedule()은 Telegram으로 넘겨 받은 object[] data를

// HotTimeSchedule로 변환해주는 함수라고 가정

bool endedEvent = ObjectToEndEventFlag(telegram.data);

// 이벤트 아이콘을 비활성화 시킨다.

// 별개이지만 GmaeObject의 확장메소드를 만들어서

// null 처리를 일일히 안해도 되게끔 하자

if(hotTimeIcon != null)

hotTimeIcon.SetActive(endedEvent);

}

break;

}

}

}

public class ControllerHotTime

{

private ModelHotTime model; // 핫타임 정보가 들어 있다는 가정

public void ScheduleEnd()

{

// HotTimeSchedule는 핫타임 스케줄 데이터라고 가정

// GetEndScheduleHotTimeEventList()는 ModelHotTime에 있는

// 스케줄 데이터들 중에서 종료된 스케줄을 뱉어주는 함수라고 가정

List<HotTimeSchedule> endSchduleList =

model.GetEndScheduleHotTimeEventList();

ObserverManager.HandleMessage(HotTimeMessage.ScheduleEnd,

endSchduleList);

}

}

위와 같이 사용할 수 있다.

참고 출처

 

observer 패턴

observer는 '관찰하는 사람', '관찰자'란 뜻이다. 관찰자는 무엇인가 감시하고 있다가 관찰 대상에 변화가 생기면 이를 즉시 감지하고 알려주는 역할을 한다. 예를 들어 가정에서 아내(observer)는 남편이 퇴근하는 모습을 보고 남편 기분이 좋은지, 나쁜지, 아니면 화가 났는지 등의 상태를 파악해 아이들에게 알려준다. 아이들은 아빠의 기분 상태에 따라 각자 처신한다. 아빠가 화가 많이 나 있으면 큰아들은 놀다가도 열심히 공부하는 모습을 보여주고,

terms.naver.com

 

다람쥐와 포동포동이

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관��

chipmunk-plump-plump.tistory.com

반응형

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

Strategy (스트레티지)  (0) 2020.04.09
FSM (유한 상태 머신)  (0) 2020.04.08
Factory (팩토리)  (0) 2020.04.08
Singleton (싱글톤)  (0) 2020.04.07
디자인패턴  (0) 2020.04.07