초식 디자인 모드 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. 관찰 모델 은 '조합' 을 이용 하여 많은 관찰자 들 을 주제 에 조합 한다.대상 간 의 이런 관 계 는 계승 을 통 해 생 긴 것 이 아니 라 운영 할 때 조합 을 이용 하 는 방식 으로 생 긴 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.