옵저버 패턴(Observer Pattern) 객체 간의 일대다(One-to-Many) 관계를 정의하여, 어떤 객체(Subject)의 상태가 변경되었을 때 그와 의존 관계에 있는 여러 객체(Observer)에게 자동으로 알림을 전송하고, 그 객체들이 자동으로 갱신될 수 있도록 하는 디자인 패턴

 

* Subject (발행자) : 옵저버를 등록하고 상태 변화 시 알림을 전달하는 역할

* Observer (옵저버/구독자) : Subject의 상태 변화에 따라 자동으로 자신의 상태를 업데이트


작동 원리

  1. Subject(발행자)는 자신의 상태가 바뀌었을 때 notify() 메서드를 호출하여 모든 Observer(구독자)에게 변경 알림
  2. Observer는 update() 메서드를 통해 변경 사항을 받아 자신을 업데이트
  3. 옵저버들은 필요에 따라 Subject에 등록(attach)하거나 해제할 수 있음
  4. 이를 통해 상호 결합도를 낮춘 상태로 실시간 동기화가 가능

예시

// 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일");
    }
}

 

 

 

 

+ Recent posts