소프트웨어 개발/Design Pattern

⑧ 디자인 패턴(Design Pattern) - Observer

늘근이 2015. 8. 12. 22:11

옵저버는 도대체 어떤놈인가? 옵저버는 어떤 객체를 살펴서 그 소식을 전해주는 일종의 정찰병의 느낌이다. 스타크래프트의 옵저버는 이상한 소리나 내면서 그냥 공중에 안들키게 할일없이 떠있는 놈에 불과하지만, 얘는 쪼금더 뭔가 적극적인 느낌이다. 마치 고양이 목에 방울을 다는것과 같은 효과이다. 여기서 방울은 옵저버이며, 고양이는 관찰이 되는 대상이다. 


일단, Observer 인터페이스와 Cat 클래스는 다음과 같다. 

Cat클래스는 옵저버에 관련된 메서드가 있어야 하는데, 이는 마치 고양이에 방울을 달아주는 역할을 한다. Cat 에는

priavet ArrayList<Observer>    //고양이 방울 리스트

public addObserver(Observer observer)    //방울을 다는 메서드

public removeObserver(Observer observer)    //방울을 제거하는 메서드

public notifyObserver()                          //방울을 울리는 메서드, 방울 리스트를 돌면서, Observer메서드의 update메서드를 실행

이 네개의 것들을 달아줄수 있다. 사실 Cat자체도 사실은 바로 위의 메서드를 가지고있는게 아니라 방울관련 기능은 추상클래스에서 구현되어있고, Cat이 고유한 기능인 다른 기능은 추상메서드로 빼서 상속받게 만들어서 관심사의 분리를 시켜줄수 있다.


방울인 Observer인터페이스는 다음의 메서드만 가지면 된다.

update(Cat cat)

그리고 Observer인터페이스를 상속받는 실질적인 클래스를 하나 만들어주고 방울이 울리면 무엇을 할지 견고하게 만들어내면 된다. 


다만, java.util에서 제공하는 Observable 클래스와 Observer 인터페이스에는 문제가 있다. 인터페이스가 아닌 클래스 Observable을 Observer에 낑겨서 사용하려면 다중상속 문제때문에 복잡해진다. 만약 관찰대상이 되어야 하는 고양이가 벌써 Animal이라는 클래스를 상속받고 있으면 Observable클래스를 다시 상속받지 못한다. 자바에서는 다중상속이 불가능하기 때문이다. 

스칼라에서는 Trait이라는 것으로 열심히 믹스인 할수 있지만, 자바는 스탠다드 기능에서 아예 클래스로 못박았기 때문에, 그다지 유용하지 못하다.