-
[TIL] 관찰자 패턴, 전략 패턴TIL 2024. 6. 20. 21:48
디자인 패턴을 쓸 때 KISS원칙 'Keep It Simple, Stupid'
단순하게 유지하기를 숙지해야한다. 복잡도는 필요한 경우에만 높여야 한다.
따라서 패턴이 적용되는지 확실치 않은 경우에는 더 자연스럽게 적용할 상황이 될 때까지 기다리는 편이 좋다.
새롭고 참신하다는 이유만으로 디자인 패턴을 사용해서는 안된다.
관찰자 패턴(ObeserverPattern)
관찰자 패턴은 일반적으로 일대다 종속 관계를 사용해 오브젝트가 통신하되 낮음 결합도를 유지하도록 할 수 있다.
한 오브젝트의 상태가 변경되면 종속된 모든 오브젝트가 자동으로 알림을 받는다.
구독한 채널에 알림이 온다던가, 단체 톡방에 누군가 글을 올리면 모두가 알림이 온다는가 등
게임플레이 과정에서 발생하는 거의 모든 상황에 관찰자 패턴을 적용할 수 있다.
C# Unity에서는 event가 옵저버 패턴같은 역할을 하는 event가 이미있다.
구독한 사람들에게 알림을 알리는 예제
//Manager.cs public class Manager:MonoBehaviour { public static Manager instance; public Action saleAct; public bool onSale=false; void Awake() { instance= this; } void Start() { StartCorutine(ItemArrive()); } private IEmurator ItemArrive() { float waitTime= Random.Range(1f,3f); Debug.Log(waitTime +"초 대기 시작"); yield return new WaitForSeconds(waitTime); //onSale=true; saleAct(); } }
//ItemObserver.cs public class ItemObserver:MonoBehaviour { public string name; void Start() { Manager.instacne.saleAct +=CheckSale; } void Update() { //if(Manager.instacne.onSale) //{ //} } private void CheckSale() { Debug.Log(name+"당장사"); } }
보스 몬스터를 처치하고 경험치와 퀘스트 완료를 알리는 예제//BossManager.cs public class BossManager:MonoBehaviour { public int KillQidx=0; public float exp=9999f; public Action<int> onDeadQuest; public Func<float,int> onDeadExp; public int count; public void OnDead() { onDeadQuest(KillQidx); onDeadExp(exp); } }
//ObserverPlayer.cs public class ObserverPlayer:MonoBehaviour { public BossManager boss; void Start() { boss.OnDeadExp+=KillMonster; } public int KillMonster(float exp) { Debug.Log(exp+"경험치를 획득"); return 0; } }
//QuestManager.cs public class QuestManager:MonoBehaviour { public BossManager boss; void Start() { boss.onDeadQuest+= QuestManaging } void OnDisable() { boss.onDeadQuest-= QuestManaging //메모리 누수 방지 } public void QuestManaging(int qidx) { if(qidx==0) { Debug.Log("보스잡기 퀘스트 완료"); } } }
Action과 Func차이점
Action은 반환값이 없고 Func는 반환값이 있다.
게임 플레이 과정에서 발생하는 거의 모든 상황에 관찰자 패턴을 적용할 수 있다.
플레이어가 적을 파괴하거나 아이템을 수집할 때 마다 이벤트가 발생할 수 있는 게임 을 예시로
점수나 업적을 추적하는 통계 시스템이 필요할 경우, 관찰자 패턴을 사용하면 원본 게임플레이 코드에 영향을 주지 않고 해당 시스템을 만들 수 있다.
그 외 관찰자 패턴 예시
- 목적, 목표 달성
- 승리, 패배 조건
- 플레이어 사망, 적, 사망
- 아이템 획득
- 사용자 인터페이스 등..
관찰자 패턴 장점과 단점
장점
- 결합도가 낮고 확장성이 높다.
- 런타임에서 옵저버 추가/ 제거가 용이하다
- C#과 유니티에서 구현이 용이하다.
단점
- 시스템의 복잡성이 증가할 수 있고 디버깅시에 힘든 경험이 생긴다.
- 관찰자들 사이에 호출 순서가 예측 불가능하다.
- 구독을 해지하지않고 옵저버가 파괴될 경우 메모리 누수가 발생할 수 있다.
전략패턴(Startegy Pattern)
실해 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다.
특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화 하며 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.
전략패턴은 객체지향 그 자체라고 볼 수 있다.
만약 캐릭터가 추가 될 때 if esle나 switch문으로 계속 추가하게 된다면 절차가 계속 늘어나게 된다.
스크립트를 나눠두면 절차는 그대로이지만 객체가 증가하게 된다
틀을 만들어놔서 캐릭터를 찍어낼 수 있다.
'TIL' 카테고리의 다른 글
[TIL] Unity 최적화 (0) 2024.07.04 [TIL]RenderingPipeline, ShaderGraph 기초 (0) 2024.06.18 [TIL] 멀티 시스템 기초 지식 (0) 2024.06.17 [TIL] 파티클시스템, 애니메이션 이벤트 (0) 2024.06.12 [TIL] 자료구조 (1) 2024.06.08