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

21. 3 디자인

감시자 패턴에 대한 설명을 위한 예제로 사용할 프로그램은 사진을 보정하는 응용을 소재로 하겠습니다.

응용에는 사진 개체를 보정을 하면 이에 대한 색조, 명도, 채도를 나태내는 뷰어로 구성을 하려고 합니다. 만약, 사진 개체의 정보가 변경되면 각 뷰어는 이에 대한 변경 통보를 받아 화면에 변경된 값을 보여줄 것입니다. 만약, 감시자 패턴을 적용하지 않는다면 사진 개체는 각 뷰어에게 변경 통보를 해야 하고 각 뷰어는 이를 화면에 나타내야 하기 때문에 의존 관계에 있습니다. 이 때 사진 개체는 다른 뷰어와 결합도가 강해 유연성이 떨어집니다.

여기에서는 사진과 같이 자신의 상태를 다른 개체에게 통보해야 하는 형식들의 추상 클래스 Subject를 정의를 할 것입니다. 그리고, 뷰어와 같이 다른 개체의 상태 변화를 감지해야 하는 역할에 대한 추상화 작업을 통하여 Observer 형식을 인터페이스 IUpdate로 정의합시다. Subject에는 상태 변화를 IUpdate 형식 개체에게 통보하는 역할을 담당합니다. 이를 위해 Subject 형식에는 통보받을 IUpdate 개체를 등록하거나 해제하는 메서드를 정의를 합니다. 그리고 변화가 발생 시에 등록된 모든 IUpdate 형식 개체에게 통보하는 메서드도 필요하겠죠. 또한 IUpdate 형식에서는 변화 통보를 받았을 때 처리하는 메서드를 약속합니다.

이제는 사진과 같은 형식들은 Subject 형식에서 파생을 받아 실제 변화가 있을 때 기반 형식의 변경 통보 메서드를 사용기만 하면 될 것입니다. 그리고, 각 Viewer에서는 통보를 받았을 때 해야 할 구체적 행위를 구현합니다.

이와 같이 감시자 패턴을 사용하면 사진 개체는 다른 뷰어들과의 의존 관계가 사라집니다.

[그림] 감시자 패턴 클래스 다이어그램
[그림] 감시자 패턴 클래스 다이어그램