Mediator vs Observer
•
큰 차이점: 상호작용 타겟의 차이
•
Observer 패턴: '한 객체'의 이벤트를 여러 객체가 구독.
◦
하나의 객체에 변화가 생기면 다른 객체에서 그 상태 변화에 따라 업데이트.
◦
데이터(Subject)를 구독하는 여러 뷰 컴포넌트들(Observers)
•
Mediator 패턴: '서로 다른 객체'의 이벤트를 서로 구독.
◦
multi option selection 리스트 박스, text input, button으로 구성된 다이얼로그에서
◦
listBox.select() → textInput.update()
◦
textInput.update() → button.activate()
◦
이렇게 서로 다른 객체의 이벤트를 참조하는 경우
문제
•
현상: 카드 게임 프로젝트에서 Game과 Player 클래스 간 결합도 문제가 있었다.
•
원인: 게임과 플레이어 클래스 간 상호 업데이트하는 부분 많았다.
해결: Mediator 패턴 응용
•
카드 클래스가 가지고 있던 책임 분리: 현재 낸 카드, 카드 스택 → CardStack 클래스로 분리
•
GameManager: Game 내 여러 컴포넌트 사이의 상호작용을 관리하는 Mediator. Phaser의 SceneManager에서 manager라는 이름만 따왔다.
•
GoF나 refactoring guru에서 Mediator 인터페이스를 보면 notify 메서드가 하나지만 가독성을 위해 컴포넌트 별로 notify 메서드를 만들었다.
•
간략한 샘플 코드 (player, game)
sample code 전체
References
•
GoF 디자인패턴 책 - 행동 패턴 - 중재자 패턴, 옵저버 패턴
•
Refactoring Guru: mediator pattern - typescript example
•
Moonsupport 옵저버 패턴과 final-form