디자인 패턴/게임 프로그래밍 패턴

[게임 프로그래밍 패턴][4]Observer 패턴

우향우@ 2024. 4. 20. 13:39

개요

Observer 패턴은 관찰자가 관찰을 당하는 대상에게 자신을 등록시키고 대상이 알림을 주면 관찰자의 함수가 호출되는 패턴을 이야기한다. 언리얼의 Delegate등과 유사한 패턴이라고 볼 수 있다. 여기서 관찰을 당하는 대상을 줄여 대상이라고  말한다.

 

구현

Observer 패턴이 처음나왔을때는 한 Notify 가상 함수를 상속받은 관찰자들에 대해 대상이 자신에게 등록된 관찰자들의 Notify를 호출하는 방식으로 구현되었다. 하지만 이는 한 상위 클래스 당 한가지 시그니처만 구현할 수 있기에 융통성이 없었다. 최근에는 C#의 delegate, 자바스크립트의 eventListener, 언리얼의 delegate등이 함수 포인터(레퍼런스)를 직접 등록받아 등록된 함수들을 호출하는 방식으로 구현되어있다.

 

사용처

Observer 패턴은 두 코드 사이의 결합을 줄여주기에 상호작용이 적고 연관성이 적은 모듈들 사이에서 간단한 상호작용을 만들어주고자 할 때 유용하다. 관찰자가 대상에게 자신을 등록하는 것 만으로도 둘 사이의 상호작용이 가능하기 때문이다.하지만 대상 입장에서 어느 관찰자가 자신을 관찰하고 있는지, 즉 자신의 알림이 누구에게 가는지 자신의 코드만을 보고 알 수 없기에 대상의 코드에 대한 유지보수성이 떨어질 수 있다. 특히 두 코드가 연관성이 높고 상호작용을 많이할 때Observer  패턴을 쓰는 것은 대상 입장에서 코드의 흐름을 읽는데 어려움을 유발해 유지보수성이 떨어질 수 있다. 따라서 Observer 패턴은 연관성이 적은 모듈사이에 사용하면 유용하나 높은 모듈 사이에서는 자제하는 것이 좋다. 

 

 

 

 

참고서적

게임 프로그래밍 패턴