오늘 학습 키워드
옵저버 패턴
오늘 학습 한 내용을 나만의 언어로 정리하기
옵저버 패턴
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의함.
예시 : 기상 관측
기상 관측을 해서 얻은 데이터를 디스플레이에 표시해야 함
인터페이스들
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 : 옵저버가 주제한테서 데이터를 가져옴
옵저버가 주제를 가지고 있는 이유
그래야 나중에 탈퇴할 때 쉬움.
디자인 원칙
상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.
객체 사이의 상호의존성을 최소화하면(= 느슨한 결합을 사용하면) 변경사항이 생겨도 무난하게 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있음.