옵저버 패턴

김세빈·2025년 5월 3일

디자인패턴

목록 보기
5/7

옵저버 패턴(Observer Pattern)이란?

옵저버 패턴은 객체의 상태 변화를 관찰(Observe) 하고 있다가, 변화가 생기면 관찰자(Observer)들에게 자동으로 알림을 전파하는 디자인 패턴이다.
즉, 주체(Subject)가 있고, 이를 구독한 옵저버(Observer) 들이 있으며, 주체의 상태가 바뀌면 옵저버들에게 자동으로 update() 메서드를 통해 알림을 준다.

이 패턴은 대표적으로 트위터, 인스타그램, 유튜브 알림 시스템과 같이 구독 기반 기능에 적합하다.


예시 코드

// 주체 역할 - 게시자
interface Subject {
  void register(Observer observer);
  void unregister(Observer observer);
  void notifyObservers();
  String getLatestPost();
}

// 옵저버 역할 - 팔로워
interface Observer {
  void update();
}

// 게시자 클래스 - 게시글을 업로드하고 알림을 전파
class User implements Subject {
  private List<Observer> followers = new ArrayList<>();
  private String latestPost;

  @Override
  public void register(Observer observer) {
    followers.add(observer);
  }

  @Override
  public void unregister(Observer observer) {
    followers.remove(observer);
  }

  @Override
  public void notifyObservers() {
    for (Observer follower : followers) {
      follower.update();
    }
  }

  @Override
  public String getLatestPost() {
    return latestPost;
  }

  public void post(String content) {
    System.out.println("📢 새 게시글: " + content);
    this.latestPost = content;
    notifyObservers();
  }
}

// 팔로워 클래스 - 알림을 받고 확인
class Follower implements Observer {
  private String name;
  private Subject user;

  public Follower(String name, Subject user) {
    this.name = name;
    this.user = user;
  }

  @Override
  public void update() {
    String newPost = user.getLatestPost();
    System.out.println(name + "님이 새 게시글을 확인함: " + newPost);
  }
}

// 실행 예시
public class Main {
  public static void main(String[] args) {
    User user = new User();

    Observer follower1 = new Follower("Alice", user);
    Observer follower2 = new Follower("Bob", user);

    user.register(follower1);
    user.register(follower2);

    user.post("오늘의 일상 공유합니다 ✨");
  }
}

  • Subject는 상태 변화가 생겼을 때 Observer들에게 알림을 보낸다.
  • 옵저버 패턴은 의존성을 낮추면서도 이벤트 기반 흐름을 구현할 수 있는 장점이 있다.
  • 대표적으로 트위터의 “팔로우한 유저가 트윗을 올리면 알림이 뜨는 기능” 등에 활용된다.

0개의 댓글