유튜브 채널을 구독하면 새 영상이 올라올 때 알림이 온다. 구독자가 1명이든 100만 명이든 채널은 신경 쓰지 않는다. 영상을 올리면 구독한 사람 전원에게 알림이 전달될 뿐이다.
이 구조가 Observer 패턴이다.
객체의 상태가 바뀌면, 그 객체를 구독하고 있는 다른 객체들에게 자동으로 통보하는 패턴이다. 통보하는 쪽을 Subject(발행자), 통보받는 쪽을 Observer(구독자) 라고 부른다.
Subject는 Observer가 누구인지, 몇 명인지 알 필요 없다. Observer를 등록·해제할 수 있는 창구만 열어두면 된다.

// Observer 인터페이스
public interface Observer {
void update(String message);
}
// Subject 인터페이스
public interface Subject {
void subscribe(Observer observer);
void unsubscribe(Observer observer);
void notifyObservers(String message);
}
// 구체 Subject — 유튜브 채널
public class YoutubeChannel implements Subject {
private List<Observer> observers = new ArrayList<>();
private String channelName;
public YoutubeChannel(String channelName) {
this.channelName = channelName;
}
@Override
public void subscribe(Observer observer) {
observers.add(observer);
}
@Override
public void unsubscribe(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update("[" + channelName + "] " + message);
}
}
// 새 영상 업로드 시 구독자 전원에게 알림
public void uploadVideo(String title) {
System.out.println("영상 업로드: " + title);
notifyObservers("새 영상: " + title);
}
}
// 구체 Observer — 구독자
public class Subscriber implements Observer {
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 알림 수신 → " + message);
}
}
YoutubeChannel channel = new YoutubeChannel("자바채널");
Subscriber s1 = new Subscriber("김자바");
Subscriber s2 = new Subscriber("이파이썬");
Subscriber s3 = new Subscriber("박코딩");
channel.subscribe(s1);
channel.subscribe(s2);
channel.subscribe(s3);
channel.uploadVideo("Observer 패턴 완전 정복");
// 김자바 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복
// 이파이썬 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복
// 박코딩 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복
channel.unsubscribe(s2);
channel.uploadVideo("Decorator 패턴 완전 정복");
// 김자바, 박코딩만 알림 수신
Java는 java.util.Observable(클래스)과 java.util.Observer(인터페이스)를 제공했지만, Java 9부터 deprecated됐다. 직접 인터페이스를 만들어 쓰거나, PropertyChangeListener 같은 대안을 쓰는 방식이 권장된다.
Observer의 핵심은 "알려줄게, 관심 있으면 등록해" 구조다. Subject가 Observer를 직접 찾아다니지 않는다. 관심 있는 쪽이 먼저 구독하고, 변화가 생기면 일괄 통보된다.