관찰자 모드(Observer Patterns)

3998 단어 observer
오늘은 관찰자 모델을 배워서 총결산을 하여 나중에 회상하기 편리하게 하였다.
먼저 정의: 관찰자 모델은 대상 간의 일대다 의존 관계를 정의하는 것이다. 한 대상의 상태가 바뀔 때 모든 의존 대상은 메시지를 전송받고 스스로 업데이트를 해서 바뀐다.
나의 이해: 생활 속에서 매우 많은 이런 사례가 있다. 예를 들어 기상 관측소와 기상 관측기의 관계, 기상 관측소는 데이터 센터로 최신 기상 소식을 얻는 것을 책임진다. 기상 관측기는 설령 이런 소식을 나타낸다 하더라도 모든 기상 관측기는 기상 관측소에 의존하고 구직자와 헤드헌터의 관계도 있다. 헤드헌터는 새로운 정보가 있다고 가정하면 구직자에게 전달할 것이다.이곳의 기상청은 바로 주제(중심)이고, 모니터는 관찰자이다.
개인 감각 가설은 관찰자 모드를 사용하려면 반드시 인터페이스 프로그래밍을 위한 디자인 원칙을 사용해야 하며 Subject 인터페이스를 정의하여 등록, 취소, 전송해야 한다.업데이트를 위해 Observer 인터페이스를 정의합니다. 관찰자가 다른 기능이 있다고 가정하고 디스플레이 () 인터페이스와 같은 다른 인터페이스를 써야 합니다.
먼저 Subject 인터페이스: 등록, 등록 취소, 메시지 푸시 방법을 제공합니다.
package interfaces;


public interface Subject {
	
	public void registeObserver (Observer observer);
	public void removeObserver (Observer observer);
	//notify: , 
	public void notifyObserver ();
	
}

그 다음에 Observer 인터페이스에서 가져온 데이터를 로컬 실례 데이터로 업데이트하는 업데이트 작업을 제공합니다.
package interfaces;

public interface Observer {
	public void uodate (float temp, float humidity, float pressure);
}

Display Element 인터페이스는 Display 방법을 제공합니다.
package interfaces;

public interface DisplayElement {
	public void display();
}

그 다음에 Weather Data, 날씨 정보 데이터 센터 클래스, Subject 인터페이스를 실현하고 set Measurements 방법과 measurment Changed 방법을 제공했다. 관찰자 등록의 실현은 사실상 이 관찰자를 센터의List에 추가하는 것이다. 통지 조작은 List를 두루 훑어보고 안의 update 방법을 사용한다.
package subjects;

import java.util.ArrayList;
import java.util.List;

import interfaces.Observer;
import interfaces.Subject;

public class WeatherData implements Subject {
	private List list;
	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData() {
		list = new ArrayList();
	}

	@Override
	public void registeObserver(Observer observer) {
		list.add(observer);
	}

	@Override
	public void removeObserver(Observer observer) {
		int i = list.indexOf(observer);
		if(i>=0) {
			list.remove(i);
		}
	}

	@Override
	public void notifyObserver() {
		for(int i=0;i<list.size();i++) {
			Observer o = (Observer)list.get(i);
			o.uodate(temperature, humidity, pressure);
		}

	}
	
	public void measurementsChanged() {
		notifyObserver();
	}
	
	public void setMeasures(float temp, float humidity, float pressure) {
		this.temperature = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}

그런 다음 관찰자 CurrentConditionDisplay를 정의합니다.새로 지을 때는 데이터 센터를 전달해야 한다.
package observers;

import subjects.WeatherData;
import interfaces.DisplayElement;
import interfaces.Observer;
import interfaces.Subject;

public class CurrentConditionDisplay implements Observer, DisplayElement {
	private float tempurature;
	private float humidity;
	private float pressure;
	private Subject weatherData;
	
	public CurrentConditionDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		weatherData.registeObserver(this);
	}

	@Override
	public void uodate(float tempurature, float humidity, float pressure) {
		this.tempurature = tempurature;
		this.humidity = humidity;
		this.pressure = pressure;
		display();

	}

	@Override
	public void display() {
		System.out.println(tempurature + ";/n" + humidity + ";/n"  +pressure );
		
	}

}

마지막으로 테스트 클래스:
package test;

import observers.CurrentConditionDisplay;
import subjects.WeatherData;

public class Test {
	
	public static void main(String args[]) {
		WeatherData weatherData = new WeatherData();
		CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
		
		weatherData.setMeasures(14.1f, 11.0f, 111.0f);
	}
}

사실 자바의 스윙 메커니즘은 이런 모델을 대량으로 운용했다. 예를 들어 button과 모니터의 관계, button은 피관찰자이고 모니터는 관찰자이며add Listener일 때 사실상 모니터 대상을 자신의 리스트에 넣고 클릭할 때list 안의 모니터의performXX 방법을 사용한다.
비록 단지 예시를 통해 이해하고 연습했을 뿐이지만 앞으로 실제 프로젝트에서 사용될 것인지, 숙련될 것인지 등 임무는 무겁고 갈 길은 멀다.

좋은 웹페이지 즐겨찾기