SMALL

Observer Pattern

옵저버 패턴이란

객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여
상태 변화가 있을 때마다 옵저버들에게 통지하도록 하는 디자인 패턴입니다.

 > 어떤 객체의 변경 사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이다.

 

 

 

옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 

이들의 관계는 보통 1:N이다. ( 1:1도 가능 ) 

 

Observer Pattern 특징

  • Loose Coupling : 상호작용을 하긴 하지만, 서로에 대해 잘 모른다
                                객체 간의 의존성을 제거할 수 있다

 

객체 간의 의존성을 줄이기 위해서 interface를 정의한다 ( Subject, Observer ) 

public interface Subject {

	public void registerObserver(Observer o);

	public void removeObserver(Observer o);

	public void notifyObserver();
}

public interface Observer {

	public void update(float tmp, float humidity, float pressure);
	
}

public interface DisplayElement {
	public void display();
}

 

Subject의 구현체, Observer List를 가지고 있다

public class WeatherData implements Subject {

	private List<Observer> observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		observers = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		int idx = observers.indexOf(o);

		if (idx >= 0) {
			observers.remove(idx);
		}
	}

	@Override
	public void notifyObserver() {
		for (Observer observer : observers) {
			observer.update(temperature, humidity, pressure);
		}
	}
	
	public void measurementsChanged() {
		notifyObserver();
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		
		measurementsChanged();
	}

}

 

Observer의 구현체, subject를 가지고 있고, 그를 통해 자신을 등록한다 

public class CurrentConditionsDisplay implements Observer, DisplayElement {

	private float temperature;
	private float humidity;
	private WeatherData weatherData;

	public CurrentConditionsDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		this.weatherData.registerObserver(this);
	}

	@Override
	public void display() {
		System.out.println("Current Condition : " + temperature + " F degrees , " 
        						+ humidity + " % humidity");

	}

	@Override
	public void update(float tmp, float humidity, float pressure) {
		this.temperature = tmp;
		this.humidity = humidity;

		display();
	}

}

 

수행 코드 

	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
		
		weatherData.setMeasurements(80, 65, 30.4f);
		weatherData.setMeasurements(82, 70, 29.2f);
		weatherData.setMeasurements(78, 90, 28.4f);
	}

 

Java 개발자라면, java.util에서 제공하는 Observer 패턴 관련 코드를 이용할 수 있다.

다만, Subject에 해당하는 Observable은 인터페이스가 아니고 상속받아야 해서 사용하는데 제한이 있을 수 있다.

import java.util.Observable;
import java.util.Observer;

 

 

 

 

LIST

+ Recent posts