Hello

[디자인 패턴] - Observer

by 볼빵빵오춘기

Observer

한 객체의 상태 변화가 있을 때, 그 객체에 의존하는 다른 객체들(옵서버)에게 자동으로 알림이 가도록 하는 패턴이다.

※ Subject (주제): 상태 변경이 일어나고, 옵서버에게 알림을 보내는 주체

Observer (관찰자): 상태 변경을 감지하고 반응하는 객체들

 

예시 코드

// 옵서버 인터페이스
interface Observer {
    void update(String message);
}

// 주제 인터페이스
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

// 구체적인 주제 클래스
class NewsAgency implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String news;

    public void setNews(String news) {
        this.news = news;
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update(news);
        }
    }
}

// 구체적인 옵서버 클래스
class Subscriber implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + "님! 새 소식이 도착했습니다: " + message);
    }
}

// 사용 예시
public class ObserverPatternExample {
    public static void main(String[] args) {
        NewsAgency agency = new NewsAgency();

        Observer user1 = new Subscriber("홍길동");
        Observer user2 = new Subscriber("김영희");

        agency.registerObserver(user1);
        agency.registerObserver(user2);

        agency.setNews("디자인 패턴 강의가 업로드되었습니다!");
    }
}

 

Observer 패턴의 장점

느슨한 결합(Loose Coupling)

Subject와 Observer는 서로 구체적인 내용을 모르기 때문에 유연하다.

 

동기화 유지

주제 객체의 상태가 바뀌면 자동으로 옵서버들이 최신 상태로 유지된다.

 

확장 용이

새로운 Observer를 쉽게 추가 가능, 주제 객체 수정 필요 없다.

 

알림 시스템 구현 쉬움

이벤트 기반 시스템을 손쉽게 구현할 수 있다. (ex. UI 업데이트, 알림 전송 등)

 

Observer 패턴의 단점

복잡성 증가

옵서버가 많아지면 알림 순서, 의존성 등 관리가 어려워진다.

 

디버깅 어려움

누가 어떤 이유로 업데이트되는지 추적이 어렵다.

 

성능 이슈

옵서버 수가 많을수록 성능 저하 가능성 있다. (모두에게 알림 전파해야 하므로)

 

Observer 패턴은 언제 사용하나?

상태 변경에 따라 여러 객체가 자동으로 반응해야 할 때

실시간 UI 업데이트, 게시판 알림, 채팅, 주식 가격 변동

 

이벤트 기반 구조 구현 시

MVC 패턴에서 View가 Model을 감시하거나, 메시지 브로커 같은 역할

 

푸시 알림 시스템

사용자가 구독한 정보가 바뀌면 알림을 자동 발송할 때

 

정리하자면

객체 간의 1:N 의존 관계를 정의하여, 주제 객체의 상태가 변경되면 관련된 옵서버 객체에 자동으로 알림을 전달하는 패턴이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기