Skip to content

Observer Pattern

Glory Day edited this page Jun 15, 2022 · 14 revisions

About

ν•œ 객체의 μƒνƒœκ°€ λ°”λ€Œλ©΄ κ·Έ 객체에 μ˜μ‘΄ν•˜λŠ” λ‹€λ₯Έ κ°μ²΄μ—κ²Œ 연락이 κ°€κ³  μžλ™μœΌλ‘œ λ‚΄μš©μ΄ κ°±μ‹ λ˜λŠ” λ°©μ‹μœΌλ‘œ μΌλŒ€λ‹€(one-to-many) μ˜μ‘΄μ„±μ„ μ •μ˜ν•œλ‹€.

UML Class

UML_Class_1

κ΄€μ°°μž νŒ¨ν„΄ UML 클래슀


  • Subject : κ°μ²΄μ—μ„œ κ΄€μ°°μžλ‘œ λ“±λ‘ν•˜κ±°λ‚˜ νƒˆν‡΄ν•  λ•Œ μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œλ₯Ό λͺ…μ‹œ
  • Observer : κ΄€μ°°μž ν΄λž˜μŠ€κ°€ 주제의 μƒνƒœκ°€ λ°”λ€ŒλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ†Œλ“œλ₯Ό λͺ…μ‹œ
  • ConcreteSubject : Subjectμ—μ„œ λͺ…μ‹œν•œ λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œ 객체. μƒνƒœλ₯Ό μ„€μ •ν•˜κ³  μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ get/set λ©”μ†Œλ“œκ°€ 포함될 μˆ˜λ„ μžˆλ‹€.
  • ConcreteObserver : Observerμ—μ„œ λͺ…μ‹œν•œ λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œ 객체. ν•΄λ‹Ή κ°μ²΄λŠ” νŠΉμ • Subjectλ₯Ό λ“±λ‘ν•΄μ„œ κ΄€μ°°ν•  수 μžˆλ‹€.

Reference

λŠμŠ¨ν•œ κ²°ν•©(Loose Coupling)

객체듀이 μƒν˜Έμž‘μš©ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, μ„œλ‘œλ₯Ό 잘 λͺ¨λ₯΄λŠ” 관계λ₯Ό μ˜λ―Έν•œλ‹€. μ‹œμŠ€ν…œμ„ λ”μš± μœ μ§€ ν•  수 μžˆλ„λ‘ λ§Œλ“€κ³ , 전체 ν”„λ ˆμž„μ›Œν¬λ₯Ό λ”μš± μ•ˆμ •μ μœΌλ‘œ λ§Œλ“€κ³  μ‹œμŠ€ν…œμ˜ μœ μ—°μ„±μ„ μ¦κ°€ν•˜κ²Œ ν•˜λ €λŠ” μ˜λ„λ₯Ό κ°€μ§„ 포괄적인 κ°œλ…μ΄λ‹€.

Example

기상 λͺ¨λ‹ˆν„°λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“ λ‹€κ³  κ°€μ •ν•œλ‹€. 이 μ‹œμŠ€ν…œμ€ 기상 μŠ€ν…Œμ΄μ…˜(μ‹€μ œ 기상 정보λ₯Ό μˆ˜μ§‘ν•˜λŠ” 물리 μž₯λΉ„), WeatherData 객체(기상 μŠ€ν…Œμ΄μ…˜μœΌλ‘œλΆ€ν„° μ˜€λŠ” 정보λ₯Ό μΆ”μ ν•˜λŠ” 객체), μ‚¬μš©μžμ—κ²Œ ν˜„μž¬ 기상 쑰건을 보여 μ£ΌλŠ” λ””μŠ€ν”Œλ ˆμ΄ μž₯λΉ„, μ΄λ ‡κ²Œ 3κ°€μ§€ μš”μ†Œλ‘œ 이루어진닀.

κ΅¬ν˜„ν•΄μ•Ό λ˜λŠ” 것을 μžμ„Έν•˜κ²Œ μ„œμˆ ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • WeatherData ν΄λž˜μŠ€μ—λŠ” 3κ°€μ§€ μΈ‘μ •κ°’(μ˜¨λ„, μŠ΅λ„, κΈ°μ••)의 getter λ©”μ†Œλ“œκ°€ μžˆλ‹€.
  • μƒˆλ‘œμš΄ 기상 μΈ‘μ • 데이터가 λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ measurementsChanged() λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€(이 λ©”μ†Œλ“œκ°€ μ–΄λ–»κ²Œ ν˜ΈμΆœλ˜λŠ”μ§€, λ™μž‘ 방식은 μ–΄λ–»κ²Œ λ˜λŠ”μ§€λŠ” λͺ¨λ₯Έλ‹€.)
  • 기상 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” λ””μŠ€ν”Œλ ˆμ΄ μš”μ†Œ 3κ°€μ§€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. WeatherDataμ—μ„œ μƒˆλ‘œμš΄ 츑정값이 λ“€μ˜€μ˜¬ λ•Œ λ§ˆλ‹€ λ””μŠ€ν”Œλ ˆμ΄λ₯Ό κ°±μ‹ ν•΄μ•Ό ν•œλ‹€.
    • ν˜„μž¬ 쑰건 λ””μŠ€ν”Œλ ˆμ΄
    • 가상 톡계 λ””μŠ€ν”Œλ ˆμ΄
    • 기상 예보 λ””μŠ€ν”Œλ ˆμ΄
  • λ””μŠ€ν”Œλ ˆμ΄λ₯Ό μ—…λ°μ΄νŠΈν•˜λ„λ‘ measurementsChanged() λ©”μ†Œλ“œμ— μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

Problem

λ§Œμ•½ measurementsChanged() λ©”μ†Œλ“œλ₯Ό μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•œλ‹€κ³  κ°€μ •ν•œλ‹€.

WeatherData::void measurementsChanged() {
    float temperature = getTemperature();
    float humidity= getHumidity();
    float pressure = getPressure();

    currentConditionsDisplay.update(temperature, humidity, pressure);
    statisticsDisplay.update(temperature, humidity, pressure);
    forecastDisplay.update(temperature, humidity, pressure);
}


μœ„ measurementsChanged() λ©”μ†Œλ“œλŠ” getter λ©”μ†Œλ“œλ“€μ„ μ΄μš©ν•΄μ„œ 기온, μŠ΅λ„, 기압을 κ°€μ Έμ˜€κ³  각 ν™”λ©΄λ§ˆλ‹€ update() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

λ¬Έμ œμ μ€ μœ„ μ½”λ“œλ₯Ό κ³ μΉ˜μ§€ μ•ŠλŠ” 이상은 λ‹€λ₯Έ λ””μŠ€ν”Œλ ˆμ΄λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μ—†λ‹€.

Solution

λ°”λ€ŒλŠ” 뢀뢄인 κ°±μ‹ λ˜λŠ” 뢀뢄을 μΊ‘μŠν™”ν•œλ‹€.

UML_Class_2

WeatherData UML 클래슀


ISubject μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 3κ°€μ§€ λ©”μ†Œλ“œκ°€ μžˆλ‹€. κΈ°λŠ₯을 μ‚΄νŽ΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • registerObserver : μ£Όμ–΄μ§„ IObserver 객체λ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ†Œλ“œ. κ΄€μ°°μžλ₯Ό λ“±λ‘ν•˜λŠ” κΈ°λŠ₯을 ν•œλ‹€.
  • removeObserver : μ£Όμ–΄μ§„ IObserver 객체λ₯Ό μ‚­μ œν•˜λŠ” λ©”μ†Œλ“œ. κ΄€μ°°μžλ₯Ό ν•΄μ œν•˜λŠ” κΈ°λŠ₯을 ν•œλ‹€.
  • notifyObserver : IObserver 객체듀을 κ°±μ‹ ν•˜λŠ” λ©”μ†Œλ“œ. λ“±λ‘λ˜μ–΄ μžˆλŠ” κ΄€μ°°μžμ˜ update() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

WeatherData에 ISubject의 κΈ°λŠ₯을 κ΅¬ν˜„ν•œλ‹€. 이둜써 WeatherDataλŠ” μΈ‘μ •κ°’(μ˜¨λ„, μŠ΅λ„, κΈ°μ••)이 λ°”λ€” λ•Œ λ§ˆλ‹€ λ””μŠ€ν”Œλ ˆμ΄μ—κ²Œ μ•Œλ €μ€€λ‹€.

또 λ‹€λ₯Έ λ°”λ€ŒλŠ” 뢀뢄인 화면에 ν‘œμ‹œν•˜λŠ” 뢀뢄을 μΊ‘μŠν™”ν•œλ‹€.

UML_Class_2

λ””μŠ€ν”Œλ ˆμ΄ UML 클래슀


λ””μŠ€ν”Œλ ˆμ΄λ“€μ€ μΈ‘μ •κ°’(μ˜¨λ„, μŠ΅λ„, κΈ°μ••)이 λ°”λ€” λ•Œ λ§ˆλ‹€ 화면에 μΈ‘μ •κ°’(μ˜¨λ„, μŠ΅λ„, κΈ°μ••)을 λ°”κΏ”μ•Όν•œλ‹€. IObserver의 update() λ©”μ†Œλ“œλŠ” WeatherDataμ—μ„œ μΈ‘μ •κ°’(μ˜¨λ„, μŠ΅λ„, κΈ°μ••)이 λ°”λ€” λ•Œ λ§ˆλ‹€ ν˜ΈμΆœλœλ‹€.

μ•„λž˜λŠ” μ΅œμ’…μ μΈ 기상 μŠ€ν…Œμ΄μ…˜μ˜ ꡬ쑰이닀.

UML_Class_2

기상 μŠ€ν…Œμ΄μ…˜ UML 클래슀


이제 λ””μŠ€ν”Œλ ˆμ΄λ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•΄λ„ WeatherData 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ , λ””μŠ€ν”Œλ ˆμ΄λŠ” 바뀐 정보λ₯Ό κ°±μ‹  받을 수 μžˆλ‹€.

Code

Clone this wiki locally