옵저버 패턴(Observer Pattern)
옵저버 패턴은 객체 간의 일대다 의존성 관계를 정의하는 디자인 패턴이다. 한 객체의 상태 변화를 관찰하고, 이를 다른 객체들에게 자동으로 알려주는데 사용된다. 이 패턴을 통해 객체 간의 결합도를 줄이고, 유연한 설계를 할 수 있다.
구성 요소
옵저버 패턴은 다음과 같은 구성 요소로 이루어져 있다.
Subject (주체): 구독자들을 갖고 있고, 상태가 변했을 때 각 구독자에게 알림을 보내는 역할을 한다.
Observer (구독자): 주체에게 등록되어 상태 변화에 따라 알림을 받는 역할을 한다.
작동 방식
주체 클래스는 등록된 모든 구독자들을 저장하기 위한 리스트를 유지한다.
주체 클래스에서 정의한 메서드를 통해 구독자들을 등록하고 제거할 수 있다.
주체 클래스의 상태가 변화할 때마다 등록된 구독자들에게 알림을 보낸다.
각 구독자들은 알림을 받는 메서드를 구현하여 주체 객체로부터의 상태 변화를 처리한다.
예제
import java.util.ArrayList;
import java.util.List;
// Subject
class WeatherStation {
private List<Observer> observers = new ArrayList<>();
private int temperature;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void setTemperature(int temperature) {
this.temperature = temperature;
notifyObservers();
}
private void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature);
}
}
}
// Observer
interface Observer {
void update(int temperature);
}
// 구독자 클래스
class MobileDevice implements Observer {
@Override
public void update(int temperature) {
System.out.println("새로운 온도: " + temperature);
// 모바일 기기에 대한 추가 로직 작성
}
}
class DesktopMonitor implements Observer {
@Override
public void update(int temperature) {
System.out.println("새로운 온도: " + temperature);
// 데스크톱 모니터에 대한 추가 로직 작성
}
}
public class Main {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
Observer mobileDevice = new MobileDevice();
Observer desktopMonitor = new DesktopMonitor();
weatherStation.addObserver(mobileDevice);
weatherStation.addObserver(desktopMonitor);
weatherStation.setTemperature(25);
// "새로운 온도: 25" 출력
weatherStation.removeObserver(mobileDevice);
weatherStation.setTemperature(30);
// "새로운 온도: 30" 출력
}
}
마무리
옵저버 패턴은 주체 클래스와 구독자 클래스 간의 느슨한 결합을 제공하는 디자인 패턴이다. 주체 객체의 상태 변화를 옵저버들에게 자동으로 알려줌으로써 객체 간의 상호작용을 유연하게 구현할 수 있다.
댓글