✅ 옵저버 패턴이란?
옵저버 패턴은 객체 간 1:N 관계를 설정하여 한 객체의 상태 변화가 여러 객체에게 자동으로 전달되도록 하는 디자인 패턴입니다. • 이벤트 기반 시스템에서 많이 사용되며, GUI 이벤트 처리, 알림 시스템 등에 활용됩니다. • 주체(Subject)가 상태를 변경하면 여러 옵저버(Observer)들이 자동으로 업데이트됩니다
import java.util.ArrayList;
import java.util.List;
// 1. 옵저버 인터페이스 (구독자)
interface Subscriber {
void update(String videoTitle);
}
// 2. 주제(Subject) 인터페이스 (유튜브 채널)
interface Channel {
void subscribe(Subscriber subscriber);
void unsubscribe(Subscriber subscriber);
void notifySubscribers(String videoTitle);
}
// 3. 구체적인 주제 클래스 (유튜브 채널)
class YouTubeChannel implements Channel {
private List<Subscriber> subscribers = new ArrayList<>();
private String channelName;
public YouTubeChannel(String channelName) {
this.channelName = channelName;
}
public void subscribe(Subscriber subscriber) {
subscribers.add(subscriber);
}
public void unsubscribe(Subscriber subscriber) {
subscribers.remove(subscriber);
}
public void notifySubscribers(String videoTitle) {
for (Subscriber subscriber : subscribers) {
subscriber.update(videoTitle);
}
}
public void uploadVideo(String videoTitle) {
System.out.println(channelName + "에 새로운 동영상 업로드: " + videoTitle);
notifySubscribers(videoTitle);
}
}
// 4. 구체적인 옵저버 클래스 (구독자)
class User implements Subscriber {
private String name;
public User(String name) {
this.name = name;
}
public void update(String videoTitle) {
System.out.println(name + "님, 새 영상이 업로드되었습니다: " + videoTitle);
}
}
// 5. 사용 예
public class Main {
public static void main(String[] args) {
YouTubeChannel channel = new YouTubeChannel("Tech Channel");
Subscriber user1 = new User("Alice");
Subscriber user2 = new User("Bob");
channel.subscribe(user1);
channel.subscribe(user2);
channel.uploadVideo("Observer Pattern in Java");
// Alice님, 새 영상이 업로드되었습니다: Observer Pattern in Java
// Bob님, 새 영상이 업로드되었습니다: Observer Pattern in Java
}
}
🔹 옵저버 패턴의 장점과 단점
✅ 장점 • 느슨한 결합(Loose Coupling): 주제(Subject)와 옵저버(Observer) 간의 의존성이 낮아 확장성이 좋음 • 자동 알림 기능: 상태가 변경될 때 구독자에게 자동으로 알림을 보낼 수 있음 • 이벤트 기반 프로그래밍에 적합
❌ 단점 • 옵저버가 많아지면 알림 비용(성능)이 증가할 수 있음 • 복잡한 관계에서는 디버깅이 어려울 수 있음