Java/디자인패턴

Observer Pattern

Bubbles 2024. 1. 4. 18:07

 

🍄 Observer Pattern이란 무엇인가? 

  • 한 객체의 상태가 바뀌면, 그 객체에 의존하는 모든 객체들에 연락이 가고 자동으로 내용이 갱신되는 방식
  • 주제에서 중요한 데이터 관리 → 주제 데이터 바뀌면 옵저버에게 바뀐 값 / 바뀌었다는 소식이 전해진다.
  • 옵저버 객체들은 주제를 구독하고 있으며(주제 객체에 등록되어 있음), 주제 데이터가 바뀌면 갱신 내용을 전달받는다. 
  • Subject : Observer = 1 : N 관계

 

public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers(); // 모든 옵저버들에게 변경내용을 알리려 호출하는 메소드
}

public interface Observer {
	public void update(float temp, float humidity, float pressure);
} // 기상 정보가 변경되었을 때 옵저버에게 전달되는 상태값들

 

  • 여기까지는 Subject가 Observer들에게 Push 하는 방식 
  • 반대로 Observer들이 Pull 해오는 방식도 있다. 
// Subject : 알림 보내기 
public void notifyObservers() {
	for (Observer observer : observers) {
		observer.update();
	} // update 메소드 인자 없이 호출하도록 
}


// Observer : 알림 받기 
public interface Observer {
	public void update();
}

// CurrentConditionsDisplay 클래스라면 업데이트를 아래처럼 구현하면 된다. 
public void update() {
	this.temperature = weatherData.getTemperature();
	this.humidity = weather.getHumidity();
	display();
} // 원하는 데이터만 (온도, 습도) 받아올 수 있다!

 

 

🍄 활용 방안 

  • 애플리케이션에서 달라지는 부분을 찾아내고 달라지는 않는 부분과 분리
    • 옵저버 패턴에서 변하는 것은 주제의 상태와 옵저버의 개수, 형식
    • 옵저버 패턴에서는 주제를 바꾸지 않고도 주제의 상태에 의존하는 객체를 바꿀 수 있음
    • 나중에 바뀔것을 대비해두면 편하게 작업할 수 있다
  • 구현보다 인터페이스에 맞춰서 프로그래밍하자
    • 주제는 Subject interfcae, 옵저버는 Observer interface
    • Observer 인터페이스를 구현하는 객체들의 등록과 탈퇴를 관리하고, 그런 객체들에 연락 돌림
  • 상속보다는 구성을 활용하자