옵저버 패턴은 객체의 상태 변화를 관찰(Observe) 하고 있다가, 변화가 생기면 관찰자(Observer)들에게 자동으로 알림을 전파하는 디자인 패턴이다.
즉, 주체(Subject)가 있고, 이를 구독한 옵저버(Observer) 들이 있으며, 주체의 상태가 바뀌면 옵저버들에게 자동으로 update() 메서드를 통해 알림을 준다.
이 패턴은 대표적으로 트위터, 인스타그램, 유튜브 알림 시스템과 같이 구독 기반 기능에 적합하다.
// 주체 역할 - 게시자
interface Subject {
void register(Observer observer);
void unregister(Observer observer);
void notifyObservers();
String getLatestPost();
}
// 옵저버 역할 - 팔로워
interface Observer {
void update();
}
// 게시자 클래스 - 게시글을 업로드하고 알림을 전파
class User implements Subject {
private List<Observer> followers = new ArrayList<>();
private String latestPost;
@Override
public void register(Observer observer) {
followers.add(observer);
}
@Override
public void unregister(Observer observer) {
followers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer follower : followers) {
follower.update();
}
}
@Override
public String getLatestPost() {
return latestPost;
}
public void post(String content) {
System.out.println("📢 새 게시글: " + content);
this.latestPost = content;
notifyObservers();
}
}
// 팔로워 클래스 - 알림을 받고 확인
class Follower implements Observer {
private String name;
private Subject user;
public Follower(String name, Subject user) {
this.name = name;
this.user = user;
}
@Override
public void update() {
String newPost = user.getLatestPost();
System.out.println(name + "님이 새 게시글을 확인함: " + newPost);
}
}
// 실행 예시
public class Main {
public static void main(String[] args) {
User user = new User();
Observer follower1 = new Follower("Alice", user);
Observer follower2 = new Follower("Bob", user);
user.register(follower1);
user.register(follower2);
user.post("오늘의 일상 공유합니다 ✨");
}
}
Subject는 상태 변화가 생겼을 때 Observer들에게 알림을 보낸다.