✅ 옵저버 패턴이란?

옵저버 패턴은 객체 간 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) 간의 의존성이 낮아 확장성이 좋음 • 자동 알림 기능: 상태가 변경될 때 구독자에게 자동으로 알림을 보낼 수 있음 • 이벤트 기반 프로그래밍에 적합

❌ 단점 • 옵저버가 많아지면 알림 비용(성능)이 증가할 수 있음 • 복잡한 관계에서는 디버깅이 어려울 수 있음