-
Notifications
You must be signed in to change notification settings - Fork 0
Observer Pattern
ν κ°μ²΄μ μνκ° λ°λλ©΄ κ·Έ κ°μ²΄μ μμ‘΄νλ λ€λ₯Έ κ°μ²΄μκ² μ°λ½μ΄ κ°κ³ μλμΌλ‘ λ΄μ©μ΄ κ°±μ λλ λ°©μμΌλ‘ μΌλλ€(one-to-many) μμ‘΄μ±μ μ μνλ€.
κ΄μ°°μ ν¨ν΄ UML ν΄λμ€
-
Subject: κ°μ²΄μμ κ΄μ°°μλ‘ λ±λ‘νκ±°λ νν΄ν λ μ¬μ©λλ λ©μλλ₯Ό λͺ μ -
Observer: κ΄μ°°μ ν΄λμ€κ° μ£Όμ μ μνκ° λ°λλμ§ νμΈνλ λ©μλλ₯Ό λͺ μ -
ConcreteSubject:Subjectμμ λͺ μν λ©μλλ₯Ό ꡬνν κ°μ²΄. μνλ₯Ό μ€μ νκ³ μμλ΄κΈ° μν΄get/setλ©μλκ° ν¬ν¨λ μλ μλ€. -
ConcreteObserver:Observerμμ λͺ μν λ©μλλ₯Ό ꡬνν κ°μ²΄. ν΄λΉ κ°μ²΄λ νΉμ Subjectλ₯Ό λ±λ‘ν΄μ κ΄μ°°ν μ μλ€.
κ°μ²΄λ€μ΄ μνΈμμ©ν μλ μμ§λ§, μλ‘λ₯Ό μ λͺ¨λ₯΄λ κ΄κ³λ₯Ό μλ―Ένλ€. μμ€ν μ λμ± μ μ§ ν μ μλλ‘ λ§λ€κ³ , μ 체 νλ μμν¬λ₯Ό λμ± μμ μ μΌλ‘ λ§λ€κ³ μμ€ν μ μ μ°μ±μ μ¦κ°νκ² νλ €λ μλλ₯Ό κ°μ§ ν¬κ΄μ μΈ κ°λ μ΄λ€.
κΈ°μ λͺ¨λν°λ§ μ ν리μΌμ΄μ
μ λ§λ λ€κ³ κ°μ νλ€. μ΄ μμ€ν
μ κΈ°μ μ€ν
μ΄μ
(μ€μ κΈ°μ μ 보λ₯Ό μμ§νλ 물리 μ₯λΉ), WeatherData κ°μ²΄(κΈ°μ μ€ν
μ΄μ
μΌλ‘λΆν° μ€λ μ 보λ₯Ό μΆμ νλ κ°μ²΄), μ¬μ©μμκ² νμ¬ κΈ°μ 쑰건μ λ³΄μ¬ μ£Όλ λμ€νλ μ΄ μ₯λΉ, μ΄λ κ² 3κ°μ§ μμλ‘ μ΄λ£¨μ΄μ§λ€.
ꡬνν΄μΌ λλ κ²μ μμΈνκ² μμ νλ©΄ μλμ κ°λ€.
-
WeatherDataν΄λμ€μλ 3κ°μ§ μΈ‘μ κ°(μ¨λ, μ΅λ, κΈ°μ)μgetterλ©μλκ° μλ€. - μλ‘μ΄ κΈ°μ μΈ‘μ λ°μ΄ν°κ° λ€μ΄μ¬ λλ§λ€
measurementsChanged()λ©μλκ° νΈμΆλλ€(μ΄ λ©μλκ° μ΄λ»κ² νΈμΆλλμ§, λμ λ°©μμ μ΄λ»κ² λλμ§λ λͺ¨λ₯Έλ€.) - κΈ°μ λ°μ΄ν°λ₯Ό μ¬μ©νλ λμ€νλ μ΄ μμ 3κ°μ§λ₯Ό ꡬνν΄μΌ νλ€.
WeatherDataμμ μλ‘μ΄ μΈ‘μ κ°μ΄ λ€μ€μ¬ λ λ§λ€ λμ€νλ μ΄λ₯Ό κ°±μ ν΄μΌ νλ€.- νμ¬ μ‘°κ±΄ λμ€νλ μ΄
- κ°μ ν΅κ³ λμ€νλ μ΄
- κΈ°μ μ보 λμ€νλ μ΄
- λμ€νλ μ΄λ₯Ό μ
λ°μ΄νΈνλλ‘
measurementsChanged()λ©μλμ μ½λλ₯Ό μΆκ°ν΄μΌ νλ€.
λ§μ½ 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() λ©μλλ₯Ό νΈμΆνλ€.
λ¬Έμ μ μ μ μ½λλ₯Ό κ³ μΉμ§ μλ μ΄μμ λ€λ₯Έ λμ€νλ μ΄λ₯Ό μΆκ°νκ±°λ μμ ν μ μλ€.
λ°λλ λΆλΆμΈ κ°±μ λλ λΆλΆμ μΊ‘μννλ€.
WeatherData UML ν΄λμ€
ISubject μΈν°νμ΄μ€μλ 3κ°μ§ λ©μλκ° μλ€. κΈ°λ₯μ μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
-
registerObserver: μ£Όμ΄μ§IObserverκ°μ²΄λ₯Ό μΆκ°νλ λ©μλ. κ΄μ°°μλ₯Ό λ±λ‘νλ κΈ°λ₯μ νλ€. -
removeObserver: μ£Όμ΄μ§IObserverκ°μ²΄λ₯Ό μμ νλ λ©μλ. κ΄μ°°μλ₯Ό ν΄μ νλ κΈ°λ₯μ νλ€. -
notifyObserver:IObserverκ°μ²΄λ€μ κ°±μ νλ λ©μλ. λ±λ‘λμ΄ μλ κ΄μ°°μμupdate()λ©μλλ₯Ό νΈμΆνλ€.
WeatherDataμ ISubjectμ κΈ°λ₯μ ꡬννλ€. μ΄λ‘μ¨ WeatherDataλ μΈ‘μ κ°(μ¨λ, μ΅λ, κΈ°μ)μ΄ λ°λ λ λ§λ€ λμ€νλ μ΄μκ² μλ €μ€λ€.
λ λ€λ₯Έ λ°λλ λΆλΆμΈ νλ©΄μ νμνλ λΆλΆμ μΊ‘μννλ€.
λμ€νλ μ΄ UML ν΄λμ€
λμ€νλ μ΄λ€μ μΈ‘μ κ°(μ¨λ, μ΅λ, κΈ°μ)μ΄ λ°λ λ λ§λ€ νλ©΄μ μΈ‘μ κ°(μ¨λ, μ΅λ, κΈ°μ)μ λ°κΏμΌνλ€. IObserverμ update() λ©μλλ WeatherDataμμ μΈ‘μ κ°(μ¨λ, μ΅λ, κΈ°μ)μ΄ λ°λ λ λ§λ€ νΈμΆλλ€.
μλλ μ΅μ’ μ μΈ κΈ°μ μ€ν μ΄μ μ ꡬ쑰μ΄λ€.
κΈ°μ μ€ν μ΄μ UML ν΄λμ€
μ΄μ λμ€νλ μ΄λ₯Ό νλ μΆκ°νκ±°λ μμ ν΄λ WeatherData ν΄λμ€λ₯Ό μμ νμ§ μκ³ , λμ€νλ μ΄λ λ°λ μ 보λ₯Ό κ°±μ λ°μ μ μλ€.
β¨ Author, Glory-Day