나의 지식 보관소
Observer Pattern / 옵저버 패턴 본문
옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의합니다.
이러한 일대다 관계는 주제(subject)의 상태가 바뀌면 옵저버(observer)에 연락이 가는 방식에 의존합니다. 연락 방식에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있습니다.
옵저버 패턴을 구현하는 방법은 여러 가지가 있지만 대부분 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인을 바탕으로 구현합니다.
//CurrentconditionsDisplay.java
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure){
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display(){
System.out.println("Current conditions: " + temperature + "F dgrees and " + humidity + "% humidity");
}
}
//DisplayElement.java
public interface DisplayElement{
public void display();
}
interface Observer{
public void update(float temp, float humidity, float pressure);
}
interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
//WeatherData.java
import java.util.ArrayList;
public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
observers = new ArrayList();
}
public void registerObserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
int i = observers.indexOf(o);
if (i >= 0)
observers.remove(i);
}
public void notifyObservers(){
for(int i = 0; i < observers.size(); i++){
Observer observer = (Observer)observers.get(i);
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
//WeatherStation.java
public class WeatherStation {
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, 29.2f);
}
}
'디자인 패턴' 카테고리의 다른 글
SOLID 원칙 (0) | 2020.08.18 |
---|---|
Strategy Pattern / 전략 패턴 (0) | 2020.08.14 |
Singleton Pattern / 싱글톤 패턴 (0) | 2020.02.02 |