티스토리 뷰

반응형





1. 구구절절 설명


한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락을 하고 자동으로 내용이 갱신되도록 하는 방식입니다. 상태가 바뀌는 객체를 주제(Subject)라고 하고 그 주제의 상태에 의존하는 객체를 옵저버(Observer)라고 하며, 주제와 Observer가 일대다( one-to-many)의 의존성을 갖습니다.


위 클래스 다이어그램을 보실까요. 주제가 있죠. 주제에서 옵저버 인터페이스를 구현한 클래스들을 추가 삭제할 수 있습니다. 보통 리스트의 형태로 옵저버들을 저장하고 있습니다. 그리고 notifyObserver를 통해서 옵저버들을 update해줍니다. 이처럼 주제와 옵저버들은 일대다 관계를 맺고 있습니다.



2. 특별한 특징


옵저버들은 주제에 의존성을 가지고 주제가 갱신될 때 옵저버들은 알아서 실행되기 때문에 인터페이스 규약만 지키면 간단히 구현할 수 있습니다.  그리고 옵저버의 추가 및 삭제도 간단합니다. 주제를 어떤 정보라 할때 그 정보를 이용하는 기능들을 쉽게 추가하고 삭제할 수 있는 것입니다. 이것이 변경에는 닫혀있고 기능 확장에는 열려있는 OCP를 지켰다고 볼 수 있죠. 

또한 주제와 옵저버는 각각 인터페이스라는 약속만 지켜진다면 재사용이 가능하고 변경되더라도 영향도가 작습니다.


헤드퍼스트 디자인 패턴에서는 이를 느슨한 결합(loose coupling)이라고 합니다. 느슨한 결합은 객체 사이의 상호의존성을 최소화하여 변경에 유연한 객체지향 시스템을 구축하게 합니다.



3. 나만의 예제 

(소스 : https://github.com/Yeomyeong/DesignPatternExample/tree/master/observer)


간단하게 옵저버 패턴을 구현해보았습니다. 제 블로그의 전체 방문자수, 오늘 방문자수, 어제 방문자수, 최근 댓글 정보를 가지고 있는 TistoryBlogDataSubject가 있고요, 그 데이터를 이용하는 옵저버가 세개가 있습니다. 

TistoryBlogDataSubject 가 notifyObserver 메서드를 실행하면 세개의 옵저버가 업데이트가 됩니다. 각 옵저버의 update 메서드는 별게 아니고, 콘솔에 각각 옵저버의 포맷에 맞게 콘솔에 로그를 찍는 것입니다.



중요한 점은 각 옵저버 구상객체는 옵저버 인터페이스에 맞게 구현만 해놓으면 주제 객체가 알아서 업데이트를 해준다는 점입니다. 이게 옵저버 패턴이죠. 지금은 콘솔에 로그를 찍는 간단한 프로그램이지만 푸시 알람을 하는 옵저버를 추가할 수도 있는 것이고요, 메일을 보내주는 옵저버도 추가할 수 있습니다. 옵저버 인터페이스라는 약속만 지킨다면요.




예제 프로그램의 전체 클래스는 위와 같습니다. 실행은 TistoryBlogDataAlram이라는 객체의 메인 메서드를 실행했고요, java.util.TimeTask 를 상속받은 TistoryBlogDataSubjectJob을 이용하여 스케줄링 했습니다. 그리고 실제 블로그 데이터는 TistoryBlogDataGetter의 get 메서드를 통해서 가져왔습니다. get 메서드는 블로그를 jsoup으로 파싱해서 정보를 가져왔습니다.



4. 생각 해봐야할 점

- 필요할 때 마다 데이터를 가져오는 풀방식과 옵저버 패턴 처럼 한곳에서 데이터를 전파하는 푸시 방식의 장단점


참고.

head first 디자인 패턴

Timer 클래스를 이용한 작업 스케쥴링 



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함