[디자인 패턴] 10. 옵저버 패턴

lhs's avatar
Nov 14, 2024
[디자인 패턴] 10. 옵저버 패턴
💡
옵저버 패턴은 주체 객체의 상태 변화가 있을 때, 이를 자동으로 등록된 옵저버 객체들에게 알리는 기법이다.
 

1. 정의

옵저버 패턴(Observer Pattern)은 행동 패턴(Behavioral Pattern) 중 하나로, 객체의 상태 변화가 있을 때, 그 상태를 관찰(Observer)하는 객체들에게 자동으로 알림을 보내는 디자인 패턴이다. 이 패턴은 주체(Subject) 객체와 옵저버(Observer) 객체 간의 관계를 정의하고, 주체 객체의 상태가 변경될 때 옵저버 객체들이 이를 자동으로 반영하도록 한다.

2. 예제 코드

public interface PubListener { void add(SubListener sub); void remove(SubListener sub); void notifyChange(String msg); }
PubListener.java
 
public class Pub implements PubListener { // 1. 구독자 명단 List<SubListener> subList = new ArrayList<>(); @Override public void add(SubListener sub) { subList.add(sub); } @Override public void remove(SubListener sub) { subList.remove(sub); } // 2. 책임 : 물건이 들어오면, 구독자들에게 알림을 보낸다. @Override public void notifyChange(String msg) { // 5초 잠자기 for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); System.out.println("."); } catch (InterruptedException e) { throw new RuntimeException(e); } } // 구독자들에게 알림주기 for (SubListener sub : subList) { sub.update(msg); } } }
Pub.java
 
public interface SubListener { void update(String msg); }
SubListener.java
 
public class Sub1 implements SubListener{ @Override public void update(String msg) { System.out.println("sub1이 받은 알림: " +msg); } }
Sub1.java
 
public class App { public static void main(String[] args) { // 1. 객체 생성 init PubListener pub = new Pub(); SubListener sub1 = new Sub1(); SubListener sub2 = new Sub2(); // 2. 구독하기 pub.add(sub1); pub.add(sub2); // 3. 상품 들어옴 (가정) String msg = "상품 들어왔다!"; // 4. notifyChange 호출 pub.notifyChange(msg); } }
App.java

3. 정리

  • PubListener 인터페이스
    • 주체 객체를 정의하는 인터페이스
  • Pub 클래스
    • 여러 옵저버들을 관리하는 주체 객체
    • subList 리스트에 옵저버들을 저장하고 notifyChange() 메서드를 통해 알림을 전파한다.
  • SubListener 인터페이스
    • 옵저버 객체를 정의하는 인터페이스
  • Sub클래스
    • 주체 객체의 상태에 반응하는 옵저버 객체
    • Pub 클래스에서 알림을 주면 update()메서드를 통해 알림을 수신한다.
  • App클래스
    • 주체 객체 pub와 옵저버 객체 sub1sub2를 생성한다.
    • sub1sub2pub에 등록한다.
    • notifyChange()메서드를 사용하여 출력을 통해 옵저버가 알림을 제대로 받았는지 확인한다.
Share article

LHS's Study Space