옵저버 패턴은 일 대 다 관계의 의존성 일 때 정의한다.
subject : 관찰되어지는 object (일) / 버튼
observers : subject에 의존적인 리스너들 (다)
subject가 변경되면 의존하고 있는 모든 리스너들의 상태가 자동으로 변경되거나 업데이트 된다.
리스너들은 기본적으로 subject가 변경되길 기다리고 있다.
느슨한 결합은 서로에 대해 최소한으로 알고 있을 때 가능하다.(인터페이스에 대한 지식)
그렇기에 서로 영향을 미치지 않고 업데이트를 할 수 있다.
옵저버를 추가하고 싶으면 단순하게 Observer 인터페이스를 구현하면 된다.
public interface Subject {
void addObserver(Observer o);
void removeObserver(Observer observer);
void notifyAllObservers();
}
public class WeatherStation implements Subject {
private int pressure;
private int temperature;
private int humidity;
private List<Observer> observers;
public WeatherStation() {
this.observers = new ArrayList<>();
}
@Override
public void addObserver(Observer o) {
this.observers.add(o);
}
@Override
public void removeObserver(Observer o) {
this.observers.remove(o);
}
@Override
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update(this.pressure, this.temperature, this.humidity);
}
}
public void setPressure(int pressure) {
this.pressure = pressure;
notifyAllObservers();
}
public void setTemperature(int temperature) {
this.temperature = temperature;
notifyAllObservers();
}
public void setHumidity(int humidity) {
this.humidity = humidity;
notifyAllObservers();
}
}
subject 인터페이스와 구현체
public interface Observer {
void update(int pressure, int temperature, int humidity);
}
public class WeatherObserver implements Observer{
private Subject subject;
private int pressure;
private int temperature;
private int humidity;
public WeatherObserver(Subject subject) {
this.subject = subject;
this.subject.addObserver(this);
}
@Override
public void update(int pressure, int temperature, int humidity) {
this.pressure = pressure;
this.temperature = temperature;
this.humidity = humidity;
showData();
}
private void showData() {
System.out.println(pressure + " " + temperature + " " + humidity+" "+this.getClass());
}
}
Observer 인터페이스와 구현체
public static void main(String[] args) {
WeatherStation station = new WeatherStation();
WeatherObserver observer1 = new WeatherObserver(station);
WeatherObserver observer2 = new WeatherObserver(station);
station.setHumidity(100);
station.setPressure(200);
station.setHumidity(300);
}
클라이언트 코드
subject는 observer가 update라는 메서드를 가지고 있다 라는 사실밖에 알지 못한다.
그렇기에 느슨한 결합이 가능하다.
유튜브 구독하고 있는 채널이 새로운 영상을 추가하면 알람이 오는 것도 옵저버 패턴의 일종이다.