오늘 학습 키워드

옵저버 패턴

오늘 학습 한 내용을 나만의 언어로 정리하기

옵저버 패턴

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의함.

예시 : 기상 관측

기상 관측을 해서 얻은 데이터를 디스플레이에 표시해야 함

인터페이스들

public interface ISubject {
	public void RegisterObserver{IObserver o};
	public void RemoveObserver(IObserver o);
	public void NotifyObservers();
}
 
public interface IObserver {
	public void Update();
}
 
public interface IDisplay {
	public void Display();
}

주제 구현체

public class WeatherData : ISubject {
	private List<IObserver> observers;
	private float temperature;
	private float humidity;
	private float pressure;
 
	public WeatherData()
	{
		observers = new List<IObserver>();
	}
 
	public void RegisterObserver(IObserver o){
		observers.Add(o);
	}
 
	public void RemoveObserver(IObserver o){
		observers.Remove(o);
	}
 
	public void NotifyObservers()
	{
	    foreach (var observer in observers)
	    {
	        observer.Update();
	    }
	}
	
	public void MeasurementsChanged()
	{
		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;
	}
}

디스플레이 구현체

public class CurrentConditions : IObserver, IDisplay {
	private float temperature;
	private float humidity;
	private WeatherData weatherData;
 
	public CurrentConditions(WeatherData wd)
	{
		weatherData = wd;
		weatherData.RegisterObserver(this);
	}
 
	public void update()
	{
		this.temperature = weatherData.temperature;
		this.humidity = weatherData.humidity;
		Display();
	}
 
	public void Display() 
	{
		System.out.println("날씨정보 출력...")
	}
}

Push와 Pull

Push : 주제가 옵저버한테 변경된 데이터를 보냄 Pull : 옵저버가 주제한테서 데이터를 가져옴

옵저버가 주제를 가지고 있는 이유

그래야 나중에 탈퇴할 때 쉬움.

디자인 원칙

상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.

객체 사이의 상호의존성을 최소화하면(= 느슨한 결합을 사용하면) 변경사항이 생겨도 무난하게 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있음.