본문 바로가기
Computer Science/Theory-Java

[Java] 자바 디자인패턴 #2 - Observer Pattern

by M-life 2016. 6. 27.
반응형

2. Observer Pattern : 특정 데이터를 여러종류의 객체에서 참조하고자 할때, 특정 데이터가 갱신된 것을 문제없이 알림받고 사용할 수 있는 디자인. 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다.


>> 갱신된 정보를 효과적으로 분산 처리하는데 유용하다.


예시) WeatherData


1. Observer.java


1
2
3
4
5
package chap2;
public interface Observer {
    public void update(float temp, float humid, float pressure);
}
 
cs



2. Subject.java


1
2
3
4
5
6
7
8
9
10
package chap2;
 
public interface Subject {
 
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
 
}
 
cs


3. DisplayElement.java


1
2
3
4
5
6
package chap2;
 
public interface DisplayElement {
    public void display();
}
 
cs



4. WeatherData.java


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
package chap2;
 
import java.util.ArrayList;
 
public class WeatherData implements Subject {
 
    private ArrayList observers;
    private float temperature;
    private float humidity;
    private float pressure;
    
    public WeatherData() {
        observers = new ArrayList();
    }
    
    @Override
    public void registerObserver(Observer o) {
        // TODO Auto-generated method stub
        observers.add(o);
    }
    @Override
    public void removeObserver(Observer o) {
        // TODO Auto-generated method stub
        int idx = observers.indexOf(o);
        if(idx >= 0)
            observers.remove(idx);
        
    }
    @Override
    public void notifyObservers() {
        // TODO Auto-generated method stub
        for (int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer) observers.get(i);
            observer.update(temperature, humidity, pressure);
        }
 
    }
    
    public void measurementChanged(){
        notifyObservers();
    }
    
    public void setMeasurements(float t, float h, float p){
        this.temperature = t;
        this.humidity = h;
        this.pressure = p;
        measurementChanged();
    }
 
}
 
cs



5. CurrentConditionDisplay.java


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
package chap2;
 
public class CurrentConditionDisplay implements Observer, DisplayElement {
 
    private float temperature;
    private float humidity;
    private Subject weatherData;
    
    public CurrentConditionDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }
 
    @Override
    public void update(float temp, float humid, float pressure) {
        // TODO Auto-generated method stub
        this.temperature = temp;
        this.humidity = humid;
        display();
    }
    
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("Current condition : "+temperature
                +"F degrees and "+humidity+"% humidity");
    }
    
}
 
cs




반응형

댓글