북극곰의 개발일기

옵저버패턴(2) 자바 내장 기능을 통해 구현하기





posted by purplebeen on Wed Jan 10 2018 19:08:13 GMT+0900 (KST) in JAVA


import java.util.Observable;
import java.util.Observer;
public class WeatherData extends Observable{
	private float temperature;
	private float humidity;
	private float pressure;

	public void measurementsChanged(){
		setChanged();
		notifyObservers();
	}
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
	
	public float getTemperature() {
		return temperature;
	}
	
	public float getHumidity() {
		return humidity;
	}
	
	public float getPressure() {
		return pressure;
	}
}

먼저 변화된 WeatherData class 이다.

java.util에서 Observer라는 인터페이스와 이 인터페이스를 구현한 클래스인 Observable이라는 클래스를 import 시켰다.

달라진 부분이 있다면 notifyObservers() 메소드를 실행하기 전에 setChanged() 메소들르 실행시킨다는 것인데,

이 메소드에서 저 메소드 안에 있는 boolean형 값이 true로 변하지 않으면 norifyObservers()가 실행되도 일도 일어나지 않는다.

어떠한 조건에 따라서 업데이트를 할때 이 기능을 활용하게되면 조금 더 효율적으로 다룰 수 있게 될 것이다.

import java.util.Observable;
import java.util.Observer;
public class CurrentConditionDisplay implements Observer, Display {
	Observable observable;
	private float temperature;
	private float humidity;
	public CurrentConditionDisplay(Observable observable) {
		this.observable = observable;
		observable.addObserver(this);
	}
	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("Current conditions : " + temperature + "F degrees and "
 + humidity + "% humidity");
	}

	@Override
	public void update(Observable obs, Object arg) {
		// TODO Auto-generated method stub
		if(obs instanceof WeatherData) {
			WeatherData weatherData = (WeatherData) obs;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			display();
		}
	}

}

디스플레이의 상태를 보여주는 CurrentConditionDisplay()는 그렇게 많이 달라지지는 않았다.

다만 달라진 부분이 있다면 기존에는 우리가 직접 만들었던 Observer 인터페이스를 구현했다는 것 정도?

자바 내부의 기능을 이용해 구현하는 형태로 바뀌면서 java.util.Observer 인터페이스를 구현하는 것으로 바뀌었다.

또한 생성자에서 Observable 객체형 데이터 observable을 this 즉 이 객체로 설정한다.

update() 메소드에서는 Observable 객체 형으로 받아와서 이 객체가 weatherData의 instance인지 확인하고 맞을 경우 이를 WeatherData 형으로 변환.

이후 getTemperature와 getHumidity()를 실행해 temperature와 humidity의 값을 설정해준다.

지난번에 직접 observer 인터페이스를 구현했을때 썼던 WeatherStation을 이용해 실행시켜보면

Subject 객체의 값을 변경해줬을 뿐인데도 Object 객체의 값이 변화되어 나오는 것을 알 수 있다.