Observer Pattern

wangjh789·2022년 8월 31일
0

Design Pattern

목록 보기
6/13

옵저버 패턴은 일 대 다 관계의 의존성 일 때 정의한다.

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라는 메서드를 가지고 있다 라는 사실밖에 알지 못한다.
그렇기에 느슨한 결합이 가능하다.

유튜브 구독하고 있는 채널이 새로운 영상을 추가하면 알람이 오는 것도 옵저버 패턴의 일종이다.

profile
기록

0개의 댓글