21. 감시자 패턴(Observer Pattern)

21.1 개요

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

감시자 패턴에서는 특정 사건이 발생하는 것을 인지하여 통보하는 개체와 이를 통보받아 처리하는 개레로 구성합니다. 특정 사건을 발생하는 것을 인지하는 개체를 게시자(감시자)라 부르며 통보받아 처리하는 개체를 구독자라고 부릅니다.

C#에서는 대리자를 제공하고 있어 이를 이용하면 보다 효과적으로 표현할 수 있습니다. 여기에서는 대리자를 사용하지 않고 감시자를 표현하는 것을 소개할게요.

 “사건이 발생하는 것을 인지하는 개체와 이를 처리하는 개체가

다르면 감시자 패턴을 고려하세요.”

21. 2 시나리오

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

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

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

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

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

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

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