관찰자 패턴은 객체 간의 일대다 종속성을 정의합니다. 이 패턴을 사용하면 한 개체의 상태가 변경되면 해당 개체에 종속된 다른 모든 개체에 자동으로 알림이 전달되고 업데이트됩니다.
이 패턴은 분산 이벤트 처리 시스템을 구현할 때 널리 사용됩니다.
구성 요소
관찰자 패턴에는 다음과 같은 주요 구성 요소가 있습니다.
- Subject(주체): 주체는 관찰자 목록을 유지하고 상태가 변경되면 등록된 관찰자에게 자동으로 알립니다.
- Observer(관찰자): 관찰자는 대상의 상태 변화를 감지하고 반응합니다. 주체에 등록되어 있으며 주체의 상태가 변경될 때 호출되는 메서드를 구현합니다.
Code
- WeatherStation은 Subject(주체) 역할을 하고 디스플레이는 Observer(관찰자) 역할을 합니다.
- SetTemperature 메서드를 호출하여 온도가 변경되면 관찰자에게 알립니다.
- 이 예제는 간단하지만 Observer 패턴의 기본 개념을 보여줍니다. 실제로는 보다 복잡한 시나리오에서 활용됩니다.
IObserver.cs
interface IObserver
{
void Update(int temperature);
}
C#Display.cs
class Display : IObserver
{
public void Update(int temperature)
{
Console.WriteLine($"Current temperature: {temperature}°C");
}
}
C#ISubject.cs
interface ISubject
{
void RegisterObserver(IObserver observer);
void UnregisterObserver(IObserver observer);
void NotifyObservers();
}
C#WeatherStation.cs
class WeatherStation : ISubject
{
private List<IObserver> observers = new List<IObserver>();
private int temperature;
public void SetTemperature(int temp)
{
temperature = temp;
NotifyObservers();
}
public void RegisterObserver(IObserver observer)
{
observers.Add(observer);
}
public void UnregisterObserver(IObserver observer)
{
observers.Remove(observer);
}
public void NotifyObservers()
{
foreach (var observer in observers)
{
observer.Update(temperature);
}
}
}
C#Program.cs
var weatherStation = new WeatherStation();
var display = new Display();
weatherStation.RegisterObserver(display);
// Notifies observers when temperature changes
weatherStation.SetTemperature(25);
C#