참치코더의 꿈 메모장

디자인 패턴 / 옵저버 패턴 정리 본문

디자인 패턴

디자인 패턴 / 옵저버 패턴 정리

참치깡 2025. 8. 28. 22:13
728x90

 

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

 

- 행동(Behavioral) 디자인 패턴 중 하나.

- 한 객체(Subject, 주제)의 상태가 변경되었을때, 그 객체에 의존하는 다른 객체들(Observer, 관찰자)에게 

  자동으로 알림을 보내는 패턴.

- 발행-구독(Publish-Subscribe) 모델과 비슷하다.

 

특징 

  * 장점

  - 느슨한 결합 : Subject와  Observer는 인터페이스로 연결(서로 독립적이다.)

  - Subject 상태 변화 -> Observer 자동 업데이트

 

 * 단점

 - 옵저버 수가 많아지면 성능 저하

 - 이벤트 순서를 제어하기 어려움

 

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// 옵저버 인터페이스
interface Observer {
  void update(String message);
}
 
// 주제(Subject) 인터페이스
interface Subject{
  void attach(Observer o); // 등록
  void detach(Observer o); // 취소
  void notifyObservers(String message); // 주제의 상태가 바뀔때 옵저버에게 알리는 메서드
}
 
// 주제(Subject) 구현체
class NewsAgency implements Subject {
  private List<Observer> observers = new ArrayList<>();
  
  @Override
  public void attach(Observer o){ // 해당 옵저버 객체를 주체 List에 저장
    observers.add(o);
  }
  
  @Override
  public void detach(Observer o){ // 해당 옵저버 객체를 주체 List에서 삭제
    observers.remove(o);
  }
  
  @Override
  public void notifyObservers(String message){
    for(Observer o : observers){
      o.update(message);
    }
  }
  
  // 새로운 뉴스 발행
  public void addNews(String news){
    System.out.println("뉴스 속보: " + news);
    notifyObservers(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 sub1 = new Subscriber("홍길동");
    Observer sub2 = new Subscriber("김철수");
    Observer sub3 = new Subscriber("이영희");
    
    agency.attach(sub1);
    agency.attach(sub2);
    agency.attach(sub3);
    
    agency.addNews("디자인 패턴 공부가 시작되었습니다.");
    agency.addNews("옵저버 패턴은 정말 유용합니다.");
    
  }
}
cs
728x90
Comments