μ˜΅μ €λ²„ νŒ¨ν„΄(Observer Pattern)

2021. 11. 6. 19:03Β·πŸ“ Computer Science/✏ Design Pattern

μ˜΅μ €λ²„ νŒ¨ν„΄(Observer Pattern)

λ§Œμ•½ μœ μ €μ˜ κ²Œμž„ λ¨Έλ‹ˆκ°€ μ—…λ°μ΄νŠΈλ˜μ–΄ UI, 이벀트 λ“± λ‹€λ₯Έ 였브젝트의 변경이 ν•„μš”ν•˜λ‹€λ©΄ μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  것인가? λ§€λ²ˆ λ‹€λ₯Έ μ˜€λΈŒμ νŠΈκ°€ κ²Œμž„ λ¨Έλ‹ˆ μ—…λ°μ΄νŠΈκ°€ λλŠ”μ§€ 확인할 순 없을 것이닀.

 

이럴 λ•Œ ν•„μš”ν•œ 것이 μ˜΅μ €λ²„ νŒ¨ν„΄μ΄λ‹€. Sudject(κ²Œμž„ λ¨Έλ‹ˆ)λ‘œλΆ€ν„° μ–΄λ– ν•œ λ³€ν™”κ°€ 생긴닀면, ObserverλŠ” 이 λ³€ν™”λ₯Ό 감지할 수 μžˆλ‹€.

 

Observer Pattern

  • 객체의 μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λŠ” κ΄€μ°°μž(μ˜΅μ €λ²„)κ°€ μžˆλ‹€. κ΄€μ°°μžλ₯Ό 객체가 κ°–κ³  μžˆλ‹€κ°€ μƒνƒœ λ³€ν™”κ°€ μžˆμ„ λ•Œ λ©”μ„œλ“œ 등을 톡해 객체가 각 μ˜΅μ €λ²„μ—κ²Œ ν†΅μ§€ν•œλ‹€.
  • 주둜 λΆ„μ‚° 이벀트 핸듀링 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 

 

μ—¬κΈ°μ„œ 핡심은 객체의 μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λŠ” 것인데, κ³Όμ—° μ–΄λ–»κ²Œ κ΄€μ°°ν•œλ‹€λŠ” κ²ƒμΌκΉŒ?

 

1. κ΅¬ν˜„

1) Observer

  • ConcreteObserverλŠ” Observer의 κ΅¬ν˜„μ²΄μ΄λ‹€.
  • notify()κ°€ 호좜되면 Subjectλ‘œλΆ€ν„° μƒνƒœ λ³€ν™”κ°€ μžˆλ‹€λŠ” μ•Œλ¦Όμ„ 받은 것이닀.
public interface Observer {
  void notify();
}
public class ConcreteObserver implements Observer {
  private ConcreteSubject subject;
  
  public ConcreteObserver(ConcreteSubject subject) {
    this.subject = subject;
  }
  
  @Override
  public void notify() {
    System.out.println("value : " + subject.getValue());
  }
}

 

2) Subject

  • Subject의 κ΅¬ν˜„μ²΄λŠ” μƒνƒœ λ³€ν™”κ°€ λ°œμƒν•˜λŠ” μ˜€λΈŒμ νŠΈμ΄λ‹€.
  • 기본적으둜 λ™μž‘μ‹œν‚€λŠ” λ©”μ„œλ“œ 외에 μ˜΅μ €λ²„λ₯Ό λ“±λ‘ν•˜λŠ” λ©”μ„œλ“œ(registerObserver())와 μ˜΅μ €λ²„μ—κ²Œ μƒνƒœ λ³€ν™”λ₯Ό μ•Œλ¦¬λŠ” λ©”μ„œλ“œ(notifyObservers())λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
  • μƒνƒœ λ³€ν™”κ°€ μžˆλ‹€λ©΄ μ˜΅μ €λ²„μ—κ²Œ notifyObservers()둜 μƒνƒœ λ³€ν™”κ°€ μžˆμŒμ„ μ•Œλ¦°λ‹€.
public class Subject {
  private List<Observer> observers;
  private int value;
  
  public Subject() {
    observers = new ArrayList();
  }
  
  public int getValue() {
    return value;
  }
  
  public void registerObserver(Observer observer) {
    observers.add(observer);
  }
  
  public void unregisterObserver(Observer observer) {
    if (observers.indexOf(observer) > -1) {
      observers.remove(observer);
    }
  }
    
  public void notifyObservers() {
    for (Observer observer : observers) {
      observer.notify();
    }
  }
}

 

3) λ‹€λ₯Έ κ΅¬ν˜„ 방법

ν˜„μž¬λŠ” ConcreteSubject subject둜 Subjectλ₯Ό μ„ μ–Έν•˜μ—¬ 값을 직접 κ°€μ Έμ˜€λŠ” 방식을 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ notify()λ₯Ό ν˜ΈμΆœν•  λ•Œ μƒνƒœ 변화에 λŒ€ν•œ 값을 ν•¨κ»˜ μ „λ‹¬ν•˜λŠ” 방법도 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ GUI ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” 마우슀 클릭, 이동, ν‚€ μž…λ ₯ λ“± μ—¬λŸ¬ κ°€μ§€ 이벀트λ₯Ό 데이터 클래슀의 ν˜•νƒœλ‘œ EventListenerλ₯Ό μ „λ‹¬ν•œλ‹€.

 

2. μ°Έκ³ 

https://seolin.tistory.com/127?category=861285 

 

λ””μžμΈ νŒ¨ν„΄ 3. μ˜΅μ €λ²„ νŒ¨ν„΄(Observer Pattern)

μ˜΅μ €λ²„λŠ” ν”„λ‘œν† μŠ€μ˜ μ •μ°°κΈ° μœ λ‹›μ΄ μ•„λ‹ˆλ‹€ μœ„ν‚€λ°±κ³Όμ—μ„œλŠ” μ˜΅μ €λ²„ νŒ¨ν„΄μ„ μ•„λž˜μ™€ 같이 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ˜΅μ„œλ²„ νŒ¨ν„΄(observer pattern)은 κ°μ²΄μ˜ μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λŠ” κ΄€μ°°μžλ“€, 즉 μ˜΅μ €λ²„λ“€

seolin.tistory.com

 

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Computer Science/✏ Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄] 더티 ν”Œλž˜κ·Έ νŒ¨ν„΄(Dirty Flag Pattern)
  • [κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄] κ²Œμž„ 루프 νŒ¨ν„΄(Game Loop Pattern)
  • MVC νŒ¨ν„΄
  • 싱글톀 νŒ¨ν„΄(Singleton Pattern)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
μ˜΅μ €λ²„ νŒ¨ν„΄(Observer Pattern)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”