옵저버 패턴(Observer Pattern)

마라탕천재 ㅣ 2024. 10. 1. 00:52

1. 옵저버 패턴이란?

옵저버 패턴(Observer Pattern)은 객체 간의 일대다 관계를 정의하여 한 객체의 상태 변화가 있을 때, 그 변화를 감지하고 다른 객체들(옵저버)에게 통지하는 디자인 패턴이다. 주로 이벤트 기반 시스템에서 많이 사용되며, 특정 객체의 상태가 변경될 때 그와 관련된 객체들에 자동으로 알림을 보내는 방식이다.

 

 

2. 옵저버 패턴의 주요 구성 요소:

  1. Subject (주제): 상태를 가지고 있으며, 옵저버들이 관심을 갖는 대상이다. 상태 변경이 발생하면 옵저버들에게 알린다.
  2. Observer (옵저버): 주제의 상태 변화를 감지하고, 주제가 상태를 변경할 때 알림을 받는 객체이다.
  3. ConcreteSubject (구체적인 주제): 주제의 상태를 보유하며, 옵저버들에게 상태 변화를 알리는 실제 객체이다.
  4. ConcreteObserver (구체적인 옵저버): 주제의 상태 변화에 반응하는 객체이다.

 

 

3. 예시 코드

// 1. Observer 인터페이스: 옵저버가 받아야 할 메서드 정의
interface Observer {
    void update(String news);  // 주제에서 변경된 내용을 받는 메서드
}

// 2. Subject 인터페이스: 옵저버 관리 및 알림 메서드 정의
interface Subject {
    void registerObserver(Observer observer);   // 옵저버 등록
    void removeObserver(Observer observer);     // 옵저버 제거
    void notifyObservers();                     // 상태 변경 시 모든 옵저버에게 알림
}

// 3. ConcreteSubject: 실제로 상태를 관리하고, 변경 시 알림을 보내는 주체
class NewsAgency implements Subject {
    private List<Observer> observers = new ArrayList<>();  // 등록된 옵저버 목록
    private String news;  // 상태 (뉴스)

    // 옵저버 등록
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    // 옵저버 제거
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    // 옵저버들에게 상태 변경 알림
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(news);  // 모든 옵저버에게 새로운 뉴스 전달
        }
    }

    // 새로운 뉴스가 들어왔을 때
    public void setNews(String news) {
        this.news = news;
        notifyObservers();  // 상태 변경을 옵저버들에게 알림
    }
}

// 4. ConcreteObserver: 실제로 상태 변화를 반영하는 옵저버
class NewsSubscriber implements Observer {
    private String name;

    public NewsSubscriber(String name) {
        this.name = name;
    }

    // 주제에서 상태가 변경되었을 때 호출되는 메서드
    @Override
    public void update(String news) {
        System.out.println(name + " 님이 받은 뉴스: " + news);
    }
}

// 5. 사용 예시
public class ObserverPatternExample {
    public static void main(String[] args) {
        // 주제 객체 생성
        NewsAgency newsAgency = new NewsAgency();

        // 옵저버들(구독자) 생성
        Observer subscriber1 = new NewsSubscriber("구독자 1");
        Observer subscriber2 = new NewsSubscriber("구독자 2");

        // 옵저버 등록
        newsAgency.registerObserver(subscriber1);
        newsAgency.registerObserver(subscriber2);

        // 뉴스 발행 (상태 변경)
        newsAgency.setNews("속보: 새로운 옵저버 패턴 튜토리얼이 발행되었습니다!");

        // 하나의 구독자가 구독 취소
        newsAgency.removeObserver(subscriber1);

        // 새로운 뉴스 발행
        newsAgency.setNews("최신 뉴스: 옵저버 패턴이 간단한 예제로 설명되었습니다.");
    }
}

 

옵저버 패턴은 상태 변경이 발생했을 때, 여러 객체에 그 변경 사항을 자동으로 통지하고 각 객체가 적절히 반응하도록 만드는 패턴이다. 이벤트나 알림 기반의 시스템에서 효과적으로 사용될 수 있다.