본문 바로가기
카테고리 없음

04:Observer Pattern

by 질서정연_ 2020. 11. 11.

1. 목적

객체간 1:다 의존 관계를 정의한다. 한 객체 상태가 변경 될 때, 그 객체와 의존 관계에 있는 모든 객체들이 자동으로

알림을 받고 상태를 갱신한다. 마치 ecampus 객체의 상태가 변경 되었을 때  cosmos 앱에서 자동 알림이 오는 것처럼.

옵저버  패턴은 일종의 푸쉬(push)서비스를 구현한다. (서버가 클라이언트에게 데이터를 주는 형태)

이벤트가 발생하면 프로그램에 이벤트 발생 정보를 전달하고, 처리하도록 하는 것(push)이 효율적이다.

 

푸쉬를 사용하는 절차는 1 푸쉬를 받고자 하는 사용자가 등록을 하고 2 특정 상황이 발생하면, 등록된 사용자에게 모두 알리고 자동으로 데이터가 갱신 된다. 

발행자는 Subject(Publisher)라고 부르고 구독자는Observer(Subscriber)라고 부른다.

 

=사용자를 등록하고, 정보가 변동하는 경우 알려주고 값을 자동으로 갱신하고자 한다. 이로 인해 느슨한 연결을 하게 되고 서로 덜 의존적이며 확장성을 지원한다. 

 

필요한 것:

  • 갱신되는 정보를 알아내기 위한 게터 메소드
  • 정보가 갱신 될 때마다 알려주는 메소드
  • 디스플레이 항목을 구현. 새로운 정보가 들어오면 갱신 해야함.
  • 시스템이 확장 가능해야함. (디스플레이 항목을 추가/제거 할 수 있어야함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class WeatherData {
        public void measurementsChanged(){
            //WeatherData의 게터 메소드를 써서 최신 측정값을 가져옴
            flaot temperature = getRemperature();
            flaot humidity = getHumidity();
            flaot pressure = getPressure();
    
            //디스플레이 갱신
            currentConditionDisplay.update(temp, humidity, pressure);
            statisticsDisplay.update(temp, humidity, pressure);
            forecastDisplay.update(temp, humidity, pressure);
        }
    
}
cs

여기서 나타나는 문제는 우리는 디스플레이를 자유롭게 삭제하고 추가할 수 있어야 한다고 말했는데 currentConditionDisplay 처럼 display 항목을 세세한 구현에 맞추어 코딩했기 때문에 새 디스플레이를 추가하려 할 때 저 항목을 복사해서 수정하여 추가해야한다. 코드를 고치지 않고는 디스플레이를 추가할 수 없다는 문제가 있는 것이다. 그러므로 9~11번째 줄을 수정해 주는것이 좋겠다. DP에서 계속 강조하는 내용이기도 한데 변경 될 수 있는 부분을 묶어서 캡슐화 해야하는것이 좋기 때문이다. (생성, 삭제가 자유롭도록..)

 

->그럼 display (current,temp,humidity, pressure) 이렇게 하는게 좋으려나? 흠

 

Subject 객체에서 일부 데이터를 관리하고 Subject의 데이터가 달라지면 옵저버에게 그 소식이 전해진다. 옵저버 객체들은 Subject 객체에 등록되어 있으며 주제의 데이터가 바뀌면 갱신 내용을 전달 받는다. 다른 옵저버가 subject에 등록 되고싶거나 탈퇴하고 싶어한다면 그렇게 해준다. 

 

대부분 Subject 인터페이스와 Observer 인터페이스가 들어있는 클래스 디자인을 바탕으로 한다.

 

디자인 원칙: 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야한다. 

 

 

댓글