초식 디자인 모드 chapter 02 - 관찰자 모드

디자인 모드 chapter 02 - 관찰자 모드
머리말
당신 의 대상 이 현재 상황 을 알 수 있 도록 도와 주 고 그 대상 이 관심 있 는 일 을 놓 치지 않 는 모델 이 있 습 니 다.대상 은 심지어 실행 할 때 계속 통 지 를 받 을 지 여 부 를 결정 할 수 있다.관찰자 모드 는 JDK 에서 가장 많이 사용 되 는 모드 중 하나 로 유용 하 다.우리 도 한 쌍 의 다 중 관계 와 소나무 결합 을 함께 소개 할 것 이다.관찰자 가 있 으 면 너 는 소식 에 정통 할 것 이다.
본문
2.1 현재 의 상황
1. Weather Data 류 는 세 가지 getter 방법 을 가지 고 세 가지 측정 치 를 얻 을 수 있 습 니 다. 온도, 습도, 기압.
2. 조심 하 는 측정 데이터 가 준비 되면 measurementsChanged () 방법 이 호출 됩 니 다.
3. 우 리 는 날씨 데 이 터 를 사용 하 는 세 가지 게시판 을 실현 해 야 한다. 현재 상태 발표, 기상 통계 발표, 일기예보 발표.Weather Data 에 새로운 측정 이 있 으 면 이 게시 물 들 은 즉시 업데이트 해 야 합 니 다.
4. 이 시스템 은 다른 개발 자 들 이 맞 춤 형 게시판 을 만 들 도록 확장 할 수 있어 야 합 니 다. 사용 자 는 마음대로 게시판 을 추가 하거나 삭제 할 수 있 습 니 다.
모든 게시판 에 update () 방법 을 직접 정의 하고 measurementsChanged () 방법 에서 호출 합 니 다.이런 방식 은 다음 과 같이 초래 할 수 있다.
1. 인터페이스 프로 그래 밍 이 아 닌 프로 그래 밍 을 실현 합 니 다.
2. 모든 새로운 게시판 에 대해 우 리 는 코드 를 수정 해 야 합 니 다.
3. 우 리 는 실행 할 때 게시판 을 동적 으로 추가 하거나 삭제 할 수 없습니다.
4. 우 리 는 아직 변 화 된 부분 을 포장 하지 않 았 다.
2.2 관찰자 모드 정의
관찰자 모드 는 대상 간 의 다 중 의존 을 정의 합 니 다. 그러면 대상 이 상 태 를 바 꿀 때 모든 의존 자 는 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
두 대상 간 의 느슨 한 결합 이 있 을 때 그들 은 여전히 상호작용 을 할 수 있 지만 서로의 세부 사항 을 잘 모른다.관찰자 모드 는 주제 와 관찰자 간 의 느슨 한 결합 을 위 한 대상 을 제공 합 니 다.
상호작용 대상 간 의 느슨 한 결합 디자인 을 위해 노력 하 다.
부 드 러 운 결합 디자인 이 탄력 있 는 OO 시스템 을 구축 하고 변화 에 대응 할 수 있 는 이 유 는 대상 간 의 상호 의존 이 최소 화 되 었 기 때문이다.
2.3 디자인 클래스 와 인터페이스
public class WeatherData implements Subject {
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData() {
		observers = new ArrayList();
	}
	
	public void registerObserver(Observer o) {
		observers.add(o);
	}
	
	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(i);
		}
	}
	
	public void notifyObservers() {
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer)observers.get(i);
			observer.update(temperature, humidity, pressure);
		}
	}
	
	public void measurementsChanged() {
		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;
	}
}

먼저 테마 자 를 위해 인 터 페 이 스 를 설계 하여 관찰자 의 등록, 로그아웃, 알림, 즉 Subject 류 를 실현 한 다음 에 관찰자 에 게 두 개의 인 터 페 이 스 를 설계 하고 update 인 터 페 이 스 는 데 이 터 를 업데이트 하 는 데 사용 하 며 display 는 데 이 터 를 표시 하 는 데 사용 합 니 다.
현재 테마 인 스 턴 스 가 구독 한 관찰자 목록 을 Array List 로 저장 합 니 다. 데이터 가 변 할 때 테마 자 는 Notify (Array List 에서 관찰자 의 update 방법 으로 데 이 터 를 업데이트 합 니 다) 방법 으로 모든 구독 자 에 게 알 립 니 다.
그 중의 한 관찰자 류
public class ForecastDisplay implements Observer, DisplayElement {
	private float currentPressure = 29.92f;  
	private float lastPressure;
	private WeatherData weatherData;

	public ForecastDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	public void update(float temp, float humidity, float pressure) {
                lastPressure = currentPressure;
		currentPressure = pressure;

		display();
	}

	public void display() {
		System.out.print("Forecast: ");
		if (currentPressure > lastPressure) {
			System.out.println("Improving weather on the way!");
		} else if (currentPressure == lastPressure) {
			System.out.println("More of the same");
		} else if (currentPressure < lastPressure) {
			System.out.println("Watch out for cooler, rainy weather");
		}
	}
}

2.4 자바 내 장 된 관찰자 모드 사용
Java 내장 Observer 인터페이스
1. setChanged () 방법 을 먼저 호출 하여 상 태 를 변 경 된 사실 로 표시 합 니 다.
2. 그리고 notifyObserver () 또는 notifyObserver (Object arg) 방법 으로 관찰자 에 게 알 립 니 다.
3. 관찰 자 에 게 데 이 터 를 전달 하려 면 notifyPBserver (Object arg) 방법 을 사용 해 야 합 니 다. 그렇지 않 으 면 관찰 자 는 관찰 가능 한 대상 에서 '당 겨' 해 야 합 니 다.
setChanged () 방법 을 도입 하면 효과 적 인 데이터 변 화 를 제어 할 수 있 습 니 다. 데이터 변경 이 필요 할 때마다 관찰자 에 게 알려 야 합 니까?
관찰자 류
public class WeatherData extends Observable {
	private float temperature;
	private float humidity;
	private float pressure;
	
	//                    arraylist, observable    
	public WeatherData() { }
	
	//      notifyBoservers()      ,           “ ”
	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;
	}
}

관찰자 류
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	Observable observable;
	private float temperature;
	private float humidity;
	
	//        Observable   ,          
	public CurrentConditionsDisplay(Observable observable) {
		this.observable = observable;
		observable.addObserver(this);
	}
	
	//  update()  ,  Observable         
	// update() ,         WeatherData  ,    getter      
	//      ,    display()
	public void update(Observable obs, Object arg) {
		if (obs instanceof WeatherData) {
			WeatherData weatherData = (WeatherData)obs;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			display();
		}
	}
	
	public void display() {
		System.out.println("Current conditions: " + temperature 
			+ "F degrees and " + humidity + "% humidity");
	}
}

2.5 java. util. Observable 의 어두 운 면
1. Observable 은 인터페이스 가 없 기 때문에 자신의 실현 을 이 룰 수 없고 자바 에 내 장 된 Observable API 와 조합 하여 사용 할 수 없 으 며 자바 util 을 다른 방법 으로 환 승 할 수 없습니다.
2. Observable 은 setChanged () 방법 을 protoced 로 정의 합 니 다. 이것 은 Observable 에서 계승 하지 않 으 면 Observable 인 스 턴 스 를 만 들 고 자신의 대상 에 조합 할 수 없다 는 것 을 의미 합 니 다.이 디자인 은 '조합 을 많이 사용 하고 계승 을 적 게 사용 하 라' 는 위반 이다.
3 장 소결
1. 관찰자 모드 에서 주제 의 상태 와 관찰자 의 수량 과 유형 이 달라 집 니 다.이 모드 를 사용 하면 주제 상태 에 의존 하 는 대상 을 바 꿀 수 있 지만 주 제 를 바 꿀 필요 가 없다.미리 계획 하 라 는 거 야.
2. 주제 와 관찰 자 는 모두 인 터 페 이 스 를 사용 하고 관찰 자 는 주제 의 인 터 페 이 스 를 이용 하여 주제 에 등록 하 며 주 제 는 관찰자 인 터 페 이 스 를 이용 하여 관찰자 에 게 알 린 다.이렇게 하면 둘 사이 가 정상적으로 작 동 할 수 있 고 동시에 느슨 한 결합 을 가 진 점 이 있다.
3. 관찰 모델 은 '조합' 을 이용 하여 많은 관찰자 들 을 주제 에 조합 한다.대상 간 의 이런 관 계 는 계승 을 통 해 생 긴 것 이 아니 라 운영 할 때 조합 을 이용 하 는 방식 으로 생 긴 것 이다.

좋은 웹페이지 즐겨찾기