본문 바로가기

Design Patterns

Observer Pattern ③ 정리

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
옵저버 패턴에서는 느슨한 결합(Loose Coupling)이라는 객체 디자인을 제공합니다. 그럼 느슨하게 결합 되어 있다는 이야기가 무슨 이야기가 될까요?? 책에는 상호작용을 하지만 서로간에 대해 서로 잘 모른다는 것을 의미 한다고 합니다. 말이 너무 어려워서 만든 소스코드를 보면서 이해해 보도록 하겠습니다.

몬스터(주제)는 플레이어에 대해서 아는 정보라고는 인터페이스 정보 뿐입니다.

public void notifyPlayer() {

            for (int i = 0; i < list.size(); i++) {

                   Player player = (Player) list.get(i);

                   player.update(weakness, frenzy);

            }

      }


이처럼 플레이어를 구현한 객체에 대한 정보 없이 단순히 인터페이스에 있는 update 메소드를 호출하는 역할만 합니다. 뭐 사실 플레이어(옵저버)를 구현한 구상 클래스가 뭐가 있는지 플레이어에 어떤 기능이 있는지에 대해서는 알필요가 전혀 없지요.

또한 플레이어(옵저버)를 언제든지 새로 추가 할 수 있습니다. 플레이어를 추가 하든, 제거하든 어쨌든 몬스터(주제)에는 전혀 영향을 미치지 않습니다. 그저 플레이어 목록의 자료구조를 이용하고 있기 때문에 거기 요소가 있고 없고는 중요하지 않습니다.

만약에 플레이어가 아닌 새로운 형식의 무언가가 생겨나더라도, Player 인터페이스의 update() 메소드만 구현해 주면 되므로 몬스터(주제) 클래스에는 전혀 영향을 미치지 않습니다.

몬스터와 옵저버에 수정할 점이 생기더라도 서로에게 영향을 미치지 않기 때문에 유연하게 수정을 할 수 있다. 뭐 이런 정도로 보시면 되겠습니다.

이렇게 느슨한 결합 관계에 있는 디자인을 사용하면 나중에 변경사항이 생기더라도 무난하게 처리 할 수 있는 유연한 객체 지향 시스템을 구축할 수 있습니다. 객체 사이의 상호 의존성을 최소화 할 수 있기 때문입니다.



그리고 앞서 이야기 했던 push 방식과 pull 방식에 대해서 알아보겠습니다. push 방식은 주제가 옵저버들에게 변경사항이 생길때 마다 상태를 전달해 주는 방식입니다. 그런데 이런 경우를 한번 생각해 보도록 할까요?

어떤 특정 옵저버는 주제의 상태를 계속적으로 기록해 주는 옵저버라고 한번 가정을 해보록 합시다. 이 옵저버는 계속적으로 혹은 일정한 시간 간격으로 상태를 알아야 합니다. 이런 경우 옵저버가 직접 주제에 있는 상태 정보를 일정 간격으로 가져와야되는데 이런 경우는 어떻게 하나요???

pull 방식의 경우 Java API로 제공하는 java.util.Observer 인터페이스와 Observable 클래스를 사용하여 구현할 수 있다고 합니다.

notifyObservers()
         If this object has changed, as indicated by the hasChanged method, then notify all of its observers and then call the clearChanged method to indicate that this object has no longer changed.

Observerable API에 이런 메소드가 정의되어있는데요 인수로 옵저버 인터페이스 객체를 받지 않으니 'ㅅ' 풀 방식이라고 할수 있겠죠.. 옵저버 구상 클래스가 이걸 갖다 쓴다고 보시면 되겠습니다.

그치만 얘는 Observerable 인터페이스가 아니고 클래스이기 때문에 이를 사용하려면 서브 클래스가 되야 합니다. 따라서 기능을 추가 할 수가 없어서 재사용성에 문제점이 생기구요. 중요한 setChanged() 메소드가 protected로 선언 되어있어서 다른 클래스에서는 호출을 할수가 없다고 합니다.

뭐.. 자세한건 API를 열심히 보도록 하시구요.. 이런 유틸 클래스가 있구나.. 정도만 알아주시면 되겠습니다. 또한 꼬우면 유틸 패키지 보다는 직접 만들어서 쓰는것이 좋죠 -ㅅ-)乃

옵저버 패턴을 공부 하면서 반드시 스타크래프트의 옵저버를 사용하겠다고 했지만 어쩌다가 와우를 사용하여 만들었네요 -_-;; 여튼 이렇게 뭔가 실생활이나 관심사에 빗대어 공부를 하는것이 머릿속에 쏙쏙 들어온다는 걸 알았구요.. 또한 블로그를 통해서 공부한다는 것 무언가 다른사람과 공유한다는 점에서 좋은것 같네요.