head first 디자인 모델 의 관찰자 모델 에 대한 정리

관찰자 모드 요점:
1. 관찰자 모드 는 대상 간 의 한 쌍 이상 의 관 계 를 정의 한다.
2. 주제 (즉, 관찰자) 는 하나의 공 통 된 인터페이스 로 관찰 자 를 업데이트 한다.
3. 관찰자 와 관찰자 간 에 소나무 결합 방식 을 사용 하고 관찰 자 는 관찰자 의 세부 사항 을 모 르 며 관찰자 가 관찰자 인 터 페 이 스 를 실현 한 것 만 알 고 있다.
4. 이 모드 를 사용 할 때 피 관찰자 로부터 데 이 터 를 밀 거나 끌 수 있 습 니 다.
5. 여러 관찰자 가 있 을 때 특정한 통지 순 서 를 가 져 서 는 안 된다.
6. 자바 는 통용 되 는 자바 util. Observable 을 포함 하여 다양한 관찰자 모델 의 실현 이 있 습 니 다.
7. java. util. Observable 실현 에 있어 서 오 는 문제 들 을 주의해 야 한다.
8. Swing 은 관찰자 모드 를 대량으로 사용 하고 많은 GUI 프레임 워 크 도 마찬가지 입 니 다.
9. 이 모드 는 자바 빈, RMI 등 여러 곳 에 도 적 용 됩 니 다.
 
관찰자 모드: 대상 간 에 한 쌍 이상 의 의존 을 정의 합 니 다. 그러면 한 대상 이 상 태 를 바 꾸 고 그 대상 에 의존 하 는 대상 은 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
 
구조 정리: 구체 적 인 주제 역할 에서 추상 적 인 관찰자 역할 의 합성 관 계 를 가리 키 고 구체 적 인 주제 대상 을 대표 하면 추상 적 인 관찰자 대상 에 대한 여러 개의 인용 이 있 을 수 있다.구체 적 인 관찰자 가 아 닌 추상 적 인 관찰 자 를 사용 하 는 이 유 는 주제 대상 이 어떤 ConcreteObserver 유형 을 인 용 했 는 지 알 필요 가 없고 추상 적 인 Observer 유형 만 알 고 있다 는 것 을 의미한다.이 때문에 구체 적 인 주제 대상 은 일련의 관찰자 대상 에 대한 인용 을 동태 적 으로 유지 하고 필요 할 때 모든 관찰자 가 공유 하 는 Update () 방법 을 호출 할 수 있다.이런 방법 을 추상 적 인 프로 그래 밍 이 라 고 한다.
 
관찰자 모드 의 장단 점:
      Observer 모델 의 장점 은 표현 층 과 데이터 논리 층 의 분 리 를 실현 하고 안정 적 인 업데이트 메시지 전달 체 제 를 정의 하 며 유형 이 뚜렷 하고 업데이트 인 터 페 이 스 를 추상 화하 여 다양한 표현 층 (관찰자) 을 가 질 수 있다 는 것 이다.그러나 그 단점 은 모든 외관 대상 이 이 추출 한 인터페이스 류 를 계승 해 야 한 다 는 것 이다. 그러면 불편 함 을 초래 할 수 있다. 예 를 들 어 다른 사람 이 쓴 외관 대상 이 이 추상 류 를 계승 하지 않 았 거나 인터페이스 가 맞지 않 아서 우 리 는 이 종 류 를 수정 하지 않 고 직접 사용 하 기 를 원한 다.Adapter 모드 를 다시 사용 하여 어느 정도 이 문 제 를 해결 할 수 있 지만 더욱 복잡 하고 번 거 로 운 디자인 을 초래 하여 오류 확률 을 높 일 수 있 습 니 다.
      관찰자 모델 의 효 과 는 다음 과 같은 몇 가지 장점 이 있다.
       (1) 관찰자 모델 은 피 관찰자 와 관찰자 사이 에 추상 적 인 결합 을 구축한다.피 관찰자 역할 이 알 고 있 는 것 은 구체 적 인 현 찰 자 집합 일 뿐 모든 구체 적 인 현 찰 자 는 추상 적 인 관찰자 의 인터페이스 에 부합된다.피 관찰 자 는 구체 적 인 관찰 자 를 알 지 못 하고 모두 공 통 된 인터페이스 가 있다 는 것 만 안다.피 관찰자 와 관찰자 가 긴밀 하 게 결합 되 지 않 았 기 때문에 서로 다른 추상 화 차원 에 속 할 수 있다.
       (2) 관찰자 모드 는 방송 통신 을 지원 한다.피 관찰 자 는 등 록 된 모든 관찰자 에 게 통 지 를 보 낼 것 이다.
관찰자 모드 는 다음 과 같은 단점 이 있다.
       (1) 피 관찰자 대상 에 직접적 이 고 간접 적 인 관찰자 가 많다 면 모든 관찰 자 를 통지 하 는 데 많은 시간 이 걸린다.
       (2) 피 관찰자 간 에 순환 의존 이 있 으 면 피 관찰자 가 순환 호출 을 촉발 하여 시스템 이 붕 괴 될 수 있다.관찰 시험 모드 를 사용 할 때 는 이 점 에 특히 주의해 야 한다.
       (3) 관찰자 에 대한 통지 가 다른 라인 을 통 해 비동기 배달 을 한다 면 시스템 은 배달 이 적절 한 방식 으로 진행 되 는 것 을 보증 해 야 한다.
       (4) 관찰자 모델 은 관찰자 로 하여 금 관찰 하 는 대상 에 변화 가 생 겼 다 는 것 을 수시로 알 게 할 수 있 지만 관찰자 모델 은 해당 하 는 메커니즘 이 없어 관찰자 로 하여 금 관찰 하 는 대상 이 어떻게 변화 하 는 지 알 게 한다.
public interface Subject {

	public void register(Observer observer);

	public void remove(Observer observer);

	public void notifiedObserver();

}

 
public interface Observer {

	public void update(float temp, float humidity, float pressure);

}

 
 
import java.util.*;

public class WeatherDate implements Subject {
	private float temp;
	private float humidity;
	private float pressure;

	List list = new ArrayList();

	public void register(Observer observer) {
		list.add(observer);

	}

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

	public void notifiedObserver() {
		for (int i = 0; i < list.size(); i++) {
			Observer observer = (Observer) list.get(i);
			observer.update(temp, humidity, pressure);

		}

	}

	public void changeDate() {
		notifiedObserver();

	}

	public void setMeasure(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		changeDate();

	}

}

 
public class CurrentConditionsDisplay implements Observer {
	
	private float temp;
	private float humidity;
	private float pressure;
	private WeatherDate wd ;
	
	public CurrentConditionsDisplay(WeatherDate wd){
		this.wd = wd;
		wd.register(this);
	
	}

	public void update(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		display();

	}
	
	public void display(){
		System.out.println("Current condition:"+ temp+"F degrees and" +humidity +"%humidty");
	}

}

 
public class WeatherStation {

	public static void main(String[] args) {

		WeatherDate weatherdate = new WeatherDate();
		CurrentConditionsDisplay condition = new CurrentConditionsDisplay(
				weatherdate);

		weatherdate.setMeasure(80, 65, 70);

	}

}

 
 

좋은 웹페이지 즐겨찾기