해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



2. Observer 패턴을 JDK API를 이용하지 않고 직접 구현하는 방법

 

ex)

 

<Observer>

public interface Display {
	public void display();
}

interface Observer{
	public void update(Observable o);
}

class KoreanDisplay implements Observer, Display{

	private Observable observable; // 등록될 Observable
	
	private float temperature;
	private float humidity;
	private float pressure;
	
	public KoreanDisplay(Observable observable) {
		this.observable = observable;
		observable.addObserver(this); //this(KoreaDisplay)를 옵저버로 등록
	}
	
	@Override
	public void display() {
		System.out.println("온도 : "+temperature);
		System.out.println("습도 : "+humidity);
		System.out.println("압력 : "+pressure);
	}

	
	/* 
	 * Observable에서 notifyObservers()를 호출할 시 해당 메소드가 호출되어 옵저버의 데이터가 갱신
	 */
	@Override
	public void update(Observable o) {
		if(o instanceof WeatherData){
			WeatherData weatherData = (WeatherData)o;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			this.pressure = weatherData.getPressure();
			display();
		}
	}
}

class EnglishDisplay implements Observer, Display{

	private Observable observable; // 등록될 Observable
	
	private float temperature;
	private float humidity;
	private float pressure;
	
	public EnglishDisplay(Observable observable) {
		this.observable = observable;
		observable.addObserver(this); //this(EnglishDisplay)를 옵저버로 등록
	}
	
	@Override
	public void display() {
		System.out.println("temperature : "+temperature);
		System.out.println("humidity : "+humidity);
		System.out.println("pressure : "+pressure);
	}

	
	/* 
	 * Observable에서 notifyObservers()를 호출할 시 해당 메소드가 호출되어 옵저버의 데이터가 갱신
	 */
	@Override
	public void update(Observable o) {
		if(o instanceof WeatherData){
			WeatherData weatherData = (WeatherData)o;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			this.pressure = weatherData.getPressure();
			display();
		}
	}
}

Observer는 JDK API를 사용했던 것과 거의 달라지는 게 없고 Observer 인터페이스만 변경했다.

 

<직접 구현한 Observable>

public interface Observable {
	public void addObserver(Observer o);     //옵저버 등록
	public void deleteObserver(Observer o);  //옵저버 제거
	public void notifyObservers();           //옵저버에 데이터 전송
}

class WeatherData implements Observable{

	private ArrayList observers;  //등록할 옵저버 리스트
	
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		observers = new ArrayList();
	}
	
	/* 
	 * 옵저버 등록 메소드
	 */
	@Override
	public void addObserver(Observer o) {
		observers.add(o);
	}

	/* 
	 * 옵저버 제거 메소드
	 */
	@Override
	public void deleteObserver(Observer o) {
		int i = observers.indexOf(o);
		if(i>=0){
			observers.remove(i);
		}
	}

	/* 
	 * 옵저버에 데이터 전달
	 */
	@Override
	public void notifyObservers() {
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer)observers.get(i);
			observer.update(this);
		}
	}
	
	public void setData(float temperature, float humidity, float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		notifyObservers();
	}

	public float getTemperature() {
		return temperature;
	}

	public float getHumidity() {
		return humidity;
	}

	public float getPressure() {
		return pressure;
	}
}

'자바 > 디자인패턴' 카테고리의 다른 글

퍼사드 패턴  (0) 2017.06.08
프로토타입 패턴  (0) 2017.06.08
컴퍼지트 패턴  (0) 2017.06.07
데코레이터(Decorator) 패턴  (0) 2017.06.06
옵저버(Observer) 패턴(1) - JDK API 활용  (0) 2017.06.06

+ Recent posts