옵저버 패턴(Observer Pattern) 객체 간의 일대다(One-to-Many) 관계를 정의하여, 어떤 객체(Subject)의 상태가 변경되었을 때 그와 의존 관계에 있는 여러 객체(Observer)에게 자동으로 알림을 전송하고, 그 객체들이 자동으로 갱신될 수 있도록 하는 디자인 패턴
* Subject (발행자) : 옵저버를 등록하고 상태 변화 시 알림을 전달하는 역할
* Observer (옵저버/구독자) : Subject의 상태 변화에 따라 자동으로 자신의 상태를 업데이트
작동 원리
- Subject(발행자)는 자신의 상태가 바뀌었을 때 notify() 메서드를 호출하여 모든 Observer(구독자)에게 변경 알림
- Observer는 update() 메서드를 통해 변경 사항을 받아 자신을 업데이트
- 옵저버들은 필요에 따라 Subject에 등록(attach)하거나 해제할 수 있음
- 이를 통해 상호 결합도를 낮춘 상태로 실시간 동기화가 가능
예시
// Observer 인터페이스
interface Subscriber {
void receive(String newspaper);
}
// ConcreteObserver 클래스
class Reader implements Subscriber {
private String name;
public Reader(String name) {
this.name = name;
}
public void receive(String newspaper) {
System.out.println(name + "님, 오늘의 신문이 도착했습니다: " + newspaper);
}
}
// Subject 클래스
class NewspaperCompany {
private List<Subscriber> subscribers = new ArrayList<>();
public void subscribe(Subscriber s) {
subscribers.add(s);
}
public void unsubscribe(Subscriber s) {
subscribers.remove(s);
}
public void publish(String newspaper) {
System.out.println("신문 발행: " + newspaper);
for (Subscriber s : subscribers) {
s.receive(newspaper);
}
}
}
public class Main {
public static void main(String[] args) {
NewspaperCompany company = new NewspaperCompany();
Subscriber reader1 = new Reader("하준");
Subscriber reader2 = new Reader("소연");
company.subscribe(reader1);
company.subscribe(reader2);
company.publish("2025년 04월 20일");
}
}