* ์ต์ ๋ฒ ํจํด์ ์ฝ๊ฒ ๋งํด์, ์ ๋ฌธ์ฌ ๊ตฌ๋ ๋ฉ์ปค๋์ฆ๊ณผ ๊ฐ๋ค๊ณ ํ ์ ์๋ค.
์ถํ์ฌ๋ฅผ ์ฃผ์ (Subject) , ๊ตฌ๋ ์๋ฅผ ์ต์ ๋ฒ(Observer) ๋ผ๊ณ ์ ํด๋ณด์.
์ต์ ๋ฒ๋ ๋ฑ๋ก(register) , ์ ๊ฑฐ(remove) ๊ฐ ์์ ๋กญ๋ค.
์ต์ ๋ฒ ํจํด ์ ์ ) ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋คํํ ์ฐ๋ฝ์ด ๊ฐ๊ณ , ์๋์ผ๋ก ๋ด์ฉ์ด ๊ฐฑ์ ๋๋ ๋ฐฉ์์ผ๋ก ์ผ๋๋ค ์์กด์ฑ์ ์ ์ํ๋ค. |
์ต์ ๋ฒ์ ๋ํ ๋ชจ๋ ์ ์ด ( ๋ฑ๋ก(register) , ์ ๊ฑฐ(remove) , ์๋ฆผ(notify) ) ๋ Subject์์ ๊ด๋ฆฌํ๋ค.
๋์์ธ ์์น ) ์๋ก ์ํธ์์ฉ์ ํ๋ ๊ฐ์ฒด ์ฌ์ด์์๋ ๊ฐ๋ฅํ๋ฉด *๋์จํ๊ฒ ๊ฒฐํฉํ๋ ๋์์ธ์ ์ฌ์ฉํด์ผํ๋ค. |
* ๋ณ๊ฒฝ์ฌํญ์ด ์๊ฒจ๋ ์ฝ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ ์๊ฐ ์๋ค. ๊ฐ์ฒด ์ฌ์ด์ ์ํธ์์กด์ฑ์ ์ต์ํ ํ ์ ์๋ค. (์ค์)
๊ธฐ์ ์คํ ์ด์ ์ฝ๋๋ค์ ์ดํด๋ณด์.
//WeatherData.java
import java.util.*;
public class WeatherData implements Subject {
private ArrayList<Observer> observers; //์ต์ ๋ฒ๋ค์ ๋ด์ list
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<Observer>(); //list ์์ฑ
}
public void registerObserver(Observer o) { // ์ต์ ๋ฒ ๋ฑ๋ก
observers.add(o);
}
public void removeObserver(Observer o) { // ์ต์ ๋ฒ ์ ๊ฑฐ
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void notifyObservers() { // ์ต์ข
์ ์ผ๋ก ์ต์ ๋ฒ์๊ฒ ์๋ ค์ฃผ๋ ๋ถ๋ถ!
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
/* ์ ๋ฐ๋ก notifyObservers()๋ฅผ ํธ์ถ ํ์ง ์๊ณ ์ด๋ ๊ฒ ํ์๊น?*/
public void measurementsChanged() {
notifyObservers();
}
/* ** ์ฒซ๋ฒ์งธ๋ก ํธ์ถ๋๋ ๋ฉ์๋ **
main๋ฌธ์์ ์คํ๋๋ ์ฝ๋.
์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๊ฐ์ง๊ณ ์๋ ๋ณ์์ ๊ฐ๊ฐ ์ ์ฅ์ ํ๋ค์,
measurementsChanged() ๋ฉ์๋ ํธ์ถ.
*/
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
// CurrentConditionsDisplay.java
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private Subject weatherData; // Subject ๊ฐ์ฒด ๊ตฌ์ฑ
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this); //ํ์ฌ ํด๋์ค๋ฅผ ์ต์ ๋ฒ์ ๋ฑ๋ก
}
/* ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ!!
์ต์ ๋ฒ๋ฅผ ๊ตฌํํ ์ด์ . ๋ณํ๊ฐ ์๊ธฐ๋ฉด ์๋ฆผ์ ๋ฐ๋ ๋ฉ์๋.
Subject ๊ฐ์ฒด์์ weatherData ๋ณํ๊ฐ ์๊ธฐ๋ฉด ์ต์ ๋ฒ๋ฅผ ๊ตฌ๋
ํ ํด๋์ค๋ค์๊ฒ
์๋ฆผ์ ๋๋ฆฐ๋ค.
*/
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
//main.java
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay( weatherData );
weatherData.setMeasurements( 80, 65, 30.4f );
weatherData.setMeasurements( 82, 70, 29.2f );
weatherData.setMeasurements( 78, 90, 33.5f );
์ด๋ ๊ฒ ๋๋ฉด ์ต์ข ์ ์ผ๋ก ์ถ๋ ฅ ๋๋ ๋ถ๋ถ์ ๊ฐ Displayํด๋์ค๋ค์ display() ๋ฉ์๋ ์ด๋ค.
์ถ๋ ฅ)
Current conditions : 80.0F degrees and 65.0% humidity
Current conditions : 82.0F degrees and 70.0% humidity
Current conditions : 78.0F degrees and 90.0% humidity
์๋ฐ ๋ด์ฅ ์ต์ ๋ฒ ํจํด ์ฌ์ฉํ๊ธฐ (Observable)
import java.util.Observable; //๋ฐ๋์ ์ฌ๋ฐ๋ฅธ Observer/Observable์ ๋ถ๋ฌ์์ผํ๋ค.
import java.util.Observer;
//์ด๋ฒ์๋ Observable์ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
public class WeatherData extends Observable { //Observable์ interface๊ฐ ์๋!!!!
private float temperature;
private float humidity;
private float pressure;
public WeatherData() { }
public void measurementsChanged() {
setChanged(); // ** ์ค์ํ ๋ถ๋ถ
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
๋ด์ฅ Observable/Observer ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ต์ ๋ฒ๋ค์ ์ง์ ๋ฑ๋ก/์ ๊ฑฐ ๋ฑ์ ๊ด๋ฆฌ ํ์ง ์์๋ ๋๋ค.
(์ํผ ํด๋์ค์์ ์์์ ๋ค ํด์ฃผ๊ธฐ ๋๋ฌธ์..)
๋ฐ๋ ๋ถ๋ถ์ ์ดํด๋ณด์. setChanged();
//setChanged()
setChanged(){
changed = true; // 1. ๋จผ์ changed ํ๋๊ทธ ๊ฐ์ ์ฐธ์ผ๋ก ์ค์ .
}
notifyObservers(Object arg){
if( changed ) { // 2. flag๊ฐ ์ฐธ์ธ ๊ฒฝ์ฐ์๋ง ์ฐ๋ฝ์ ๋๋ฆฐ๋ค.
//๋ชฉ๋ก์ ์๋ ๋ชจ๋ ์ต์ ๋ฒ๋ค์๊ฒ{
update(this, arg);
}
changed = false;
}
notifyObservers(){
notifyObservers(null);
}
* ์ธ์ ์ฌ์ฉ์ด ๋๋๊ฐ? ์๋ฅผ ๋ค์ด, ๊ธฐ์ ์คํ ์ด์ ์ ์๋ ์จ๋ ์ผ์๊ฐ ์๋ ๋ฏผ๊ฐํด์ 0.1 ๋ ๋จ์๋ก ์ด ์์์ด ๋ฐ๋๋ค๊ณ ํด๋ณด๋ฉด, ์ต์ ๋ฒ๋ค์๊ฒ ์์๋ก ์ฐ๋ฝ์ ๋๋ ค์ผ ํ๋ค. ํ์ง๋ง ํ์์ ๋ฐ๋ผ 0.5๋ ์ด์ ๋ฐ๋์์๋๋ง ์ฐ๋ฝ์ ๋๋ฆฌ๊ณ ์ถ์๋๊ฐ ์๋๋ฐ ๊ทธ๋ ์ฌ์ฉํ๋ฉด ์ ๋นํ ๊ฑฐ ๊ฐ๋ค.
java.util.Observable์ ๋จ์
์๋ฐ ๋ด์ฅ Observable์ ํค๋ํผ์คํธ ๋์์ธ ํจํด์ ์ฝ์ด ๋ณด๋ฉด ๋ฌธ์ ์ ์ ์ง์ ํ๊ณ ์๋ค.
Observable์ ํด๋์ค์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก Observable์ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผํ๋ค. ์ด๋ ์ฌ์ฌ์ฉ์ฑ์ ์ ์ฝ์ด ์๊ธฐ๊ฒ ๋๋ค.
ํจํด์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ ์ ์ฝ์ด ์๊ธด๋ค.
๊ฒ๋ค๊ฐ setChanged()๋ฉ์๋๋ protected๋ก ์ ์ธ ๋์ด ์์ด์ Observable์ ์๋ธ ํด๋์ค์์๋ง ํธ์ถํ ์ ์๋ค.
์ด๋ฐ ๋์์ธ์ ์์๋ณด๋ค๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ค๋ ๋์์ธ ์์น์์๋ ์๋ฐฐ๊ฐ ๋๋ค.