디자인 모드--자바 내 장 된 관찰자 모드 사용(Observer Pattern)

2507 단어 디자인 모드
관찰자 모델 은 대상 의 행위 모델 로 말 그대로 관찰자 와 피 관찰자 가 존재 한다. 관찰자 모델 은 여러 관찰자 로 하여 금 같은 피 관찰 대상 을 동시에 감청 하 게 하고 피 관찰 대상 이 변화 할 때 모든 관찰자 에 게 알 리 며 각 관찰자 가 해당 하 는 응답 을 할 수 있 도록 한다.
자바 에 서 는 관찰 자 모드 를 실현 하기 위해 Observerable 류 와 Observer 인 터 페 이 스 를 제공 합 니 다.
JAVA 에 내 장 된 Observer 류 는 좋 은 디자인 이 아니다.우선,Observable 은 하나의'클래스'이기 때문에 하나의 클래스 를 설계 하여 계승 해 야 한다.만약 에 Observable 류 와 다른 초 류 를 동시에 가 지 려 고 한다 면 딜레마 에 빠 질 것 이다.이것 은 Observable 의 재 활용 잠재력 을 제한 했다.그 다음으로 Observable 은 관건 적 인 방법 인 setChange()방법 을 보호 합 니 다.이것 은 Observable 에서 계승 하지 않 으 면 Observable 인 스 턴 스 를 만 들 고 자신의 대상 에 조합 할 수 없습니다.이 디자인 은 두 번 째 디자인 원칙 인'조합 을 많이 사용 하고 계승 을 적 게 사용 합 니 다'를 위반 한 것 을 의미 합 니 다.
 
1.피 관찰자 계승 observable
public class WeatherData extends Observable {

	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;
	}

}

 2,관찰자 구현 Observer 인터페이스
public class CurrentConditionsDisplay implements Observer, DisplayElement {

	private float temperature;
	private float humidity;
	private float pressure;
	private Observable observable;

	public CurrentConditionsDisplay(Observable observable) {
		this.observable = observable;
		this.observable.addObserver(this);
	}

	@Override
	public void display() {
		System.out.println("Current conditions:" + temperature
				+ "F degrees and " + humidity + "% humidity " + pressure
				+ " pressure");
	}

	@Override
	public void update(Observable obs, Object arg) {
		if(obs instanceof WeatherData){
			WeatherData weatherData = (WeatherData) obs;
			this.humidity = weatherData.getHumidity();
			this.temperature = weatherData.getTemperature();
			display();
		}
	}
}
 
3.테스트 클래스
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		WeatherData wd = new WeatherData();
		CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
		wd.setMeasurements(21, 13, 30.4f);
		wd.setMeasurements(1, 2, 3f);
	}

}

좋은 웹페이지 즐겨찾기