21. 감시자 패턴(Observer Pattern)

21.1 개요 

감시자 패턴은 하나의 개체가 여러 개체의 상태의 변화를 감지하는 역할을 담당하게 하는 패턴입니다. 특정 개체의 상태가 바뀌게 되었을 때 이를 반영해야 하는 개체가 여러 개가 있을 수 있습니다. 이 때 다른 개체의 상태가 바뀌었을 때 자신도 변화해야 하기 때문에 결합도가 강하여 유연하게 프로그래밍 하기 힘들어집니다. 이 경우에 감시자 패턴을 사용을 하면 결합도를 느슨하게 하여 유연한 프로그래밍을 할 수 있게 해 줍니다.

감시자 패턴에서는 감시자는 다른 개체의 상태의 변화를 통보를 받는 역할과 이 변화를 구독하기를 원하는 개체에게 알려주는 역할을 합니다. 이를 위해 감시자 개체는 상태의 변화가 발생하는 주 개체에게 상태 변화에 대한 통보를 해 줄 것을 요청하게 됩니다. 이를 구독이라 얘기합니다. 그리고, 주 개체의 상태의 변화가 발생하면 구독 요청한 감시자들에게 이를 알려주게 됩니다. 이를 게시라고 얘기합니다.

감시자 패턴은 상태의 변화가 발생하는 개체에 따라 영향을 받는 개체가 다양할 경우에 상태의 변화를 감지하는 역할을 감시자에게 집중시키고 있습니다. 만약 감시자가 없다고 하더라도 의존 관계가 단순한 경우에는 굳이 감시자 패턴을 사용할 필요는 없을 것입니다. 하지만 의존 관계가 복잡하거나 앞으로 복잡해 질 수 있을 경우에 감시자 패턴을 사용하여 유연성을 높일 수 있을 것입니다.

 “다른 개체의 상태 변화에 따라 의존하는 개체가 있다면 감시자 패턴을 고려하세요.”

 

21. 2 시나리오

혁재는 지난 번에 사진 보정 응용을 만들고 나서 몇 가지 기능을 추가한다고 하네요. 사진을 보정하는 작업 공간외에도 사진의 정보와 미리 보기 기능이 필요하다면서 열심히 작업 중입니다.

“아빠, 사진이 보정되면 이에 대한 정보를 정보 뷰에도 알려주고 미리 보기 뷰에도 알려주는 것을 추가했어요.”

“그래, 그럼 한 번 보여줄래?”

“아니요. 아직은 아니예요. 지금은 사진 개체가 자신의 상태가 변경이 되면 직접 정보 뷰와 보기 뷰에게 알려주게 하였는데 앞으로 다른 뷰를 확장시킬 때마다 사진 형식을 수정하는 것은 좀 아닌 것 같아 보여요.”

“혁재가 이제 구현만 하는 것이 아니고 설계에도 신경쓰네.”

“지난 번에 메멘토 패턴을 보고 난 후에 감시자 패턴을 잠시 본 적이 있는데 사진과 같이 상태가 변경될 경우에 이를 감시하는 감시자를 정의를 해야겠어요. 그리고, 사진처럼 감시자에게 자신의 상태가 변경됨을 보고할 필요가 있는 형식에 대한 추상화도 같이 해 볼까 하는 중이예요.”

“그래, 수고해라. 말하는 것 보니깐 조만간 멋있는 작품을 만날 수 있을 것 같네. 화이팅!”


21. 감시자 패턴(Observer Pattern) 설계

21. 감시자 패턴(Observer Pattern) 구현