2014년 2월 14일 금요일

Observer Pattern


package my.observer;

public class WeatherVO {

private int temperature;
private int humidity;
private int pressure;
public WeatherVO(){}
public WeatherVO(int temperature, int humidity, int pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
}
public int getTemperature() {
return temperature;
}
public void setTemperature(int temperature) {
this.temperature = temperature;
}
public int getHumidity() {
return humidity;
}
public void setHumidity(int humidity) {
this.humidity = humidity;
}
public int getPressure() {
return pressure;
}
public void setPressure(int pressure) {
this.pressure = pressure;
}

}




package my.observer;

public interface DataSource {
public void print();

public WeatherVO getWeather();
}




package my.observer;

public class WeatherMeasure implements DataSource{
private WeatherVO weather;
public WeatherMeasure(WeatherVO weather){
this.weather = weather;
}
@Override
public WeatherVO getWeather(){
return weather;
}
@Override
public void print(){
String query = weather.getTemperature() + " / " + weather.getHumidity() + " / " + weather.getPressure();
System.out.println(query);
}
}








package my.observer;


public interface Notification {
public void addObserver(Observer observer);
public Observer removeObserver(Observer observer);
public void notifyObserver();
}





package my.observer;

import java.util.ArrayList;

public class WeatherData implements Notification{
protected ArrayList<Observer> observers = new ArrayList<>();
private DataSource dataSource;

public WeatherData(DataSource dataSource){
this.dataSource = dataSource;
}
@Override
public void addObserver(Observer observer) {
for(Observer o : observers){
if(o.equals(observer)) return;
}
observers.add(observer);
}

@Override
public Observer removeObserver(Observer observer) {
for(int i=0; i<observers.size(); ++i){
if(observers.get(i).equals(observer)){
observers.remove(i); break;
}
}
return null;
}

@Override
public void notifyObserver() {
for(int i=0; i<observers.size(); ++i) observers.get(i).update(dataSource);
}
}




package my.observer;

public interface Observer {

public void update(DataSource dataSource);
}




package my.observer;

public class ConditionView implements Observer{

@Override
public void update(DataSource dataSource) {
dataSource.print();
}
}



package my.observer;

public class ExplainView implements Observer{

@Override
public void update(DataSource dataSource) {
WeatherVO vo = dataSource.getWeather();
System.out.println("온도 : " + vo.getTemperature());
System.out.println("습도 : " + vo.getHumidity());
System.out.println("기압 : " + vo.getPressure());
}
}




package my.observer;

import org.junit.Test;

public class WeatherTest {

@Test
public void test(){
WeatherVO vo = new WeatherVO(5, 6, 7);
WeatherData weather = new WeatherData(new WeatherMeasure(vo));
Observer conditionView = new ConditionView();
Observer explainView = new ExplainView();
weather.addObserver(conditionView);
weather.addObserver(explainView);
weather.removeObserver(conditionView);
weather.notifyObserver();
}
}











댓글 없음:

댓글 쓰기