정의 된 관찰자 패턴
객체가 상태를 변경 많은 개체, 그래서 사이의 정의 종속성, 그 부양 가족이 알림을 자동으로 업데이트됩니다.
사용 시나리오
게시 및 구독, 잡지의 공개 및 기타 마이크로 채널 번호를 알려
디자인 원칙
디자인 객체와 작업 사이 느슨하게 결합 된 상호 작용
장점과 단점
장점 :
1, 관찰자와 관찰 추상적 인 결합.
2 모니터 트리거 메카니즘의 확립.
단점 :
관찰자의 수는, 모든 관찰자가 매우 시간이 많이 걸리는 것 통지하는 경우 1, 비동기 처리가 좋습니다.
2, 사이클 호출이 발생할 수 있습니다.
UML의 클래스 다이어그램
예
응용 프로그램의 예는 어디 책은 "헤드 퍼스트 디자인 패턴"
테마 (관찰자) 인터페이스
패키지 com.study.headfirst.oberver을; / ** * 주제 * * @author의 MDL * @date 2019년 12월 2일 * / 공용 인터페이스 주제 { / ** * 등록 관찰자 * * @Param * / 공용 공극 registerObserver (관찰자); / ** * 관찰자를 제거 * * @param O * / 공용 공극 removeObserver (관찰자 O); / ** * 모든 관찰자 통지 * / 공용 공극 notifyObserver (); }
테마 (관찰자) :
패키지 com.study.headfirst.oberver을; 수입 인 java.util.ArrayList; 수입 은 java.util.List; / ** * 관찰자인가 * * @author의 MDL * @date 2019년 12월 2일 * / 공용 클래스 WeatherData의 구현의 주제 { / ** * 기록 관찰자 * / 개인 목록 <옵저버> OS; / ** * 온도 * / 개인 유동 온도; / ** * 습도 * / 개인 플로트 습도; 공공 WeatherData () { OS = 새로운 ArrayList를 <옵저버> (); } / * (비 자바 독) * @see com.study.headfirst.oberver.Subject # registerObserver (com.study.headfirst.oberver.Observer) * / @보수 공개 공극 registerObserver (관찰자 O) { (a) os.add; } / * (비 자바 독) * @see com.study.headfirst.oberver.Subject # removeObserver (com.study.headfirst.oberver.Observer) * / @보수 공개 공극 removeObserver (관찰자 O) { INT I = os.indexOf (O); 경우 (I> 0 ) { os.remove (I); } } / * (비 자바 독) * @see com.study.headfirst.oberver.Subject # notifyObserver () * / @보수 공공 무효 notifyObserver () { 에 대한 (관찰자 O : 운영 체제) { o.update (온도, 습도); } } 공개 공극 setMeasurements ( 유동 온도, 플로트 습도) { 이 .temp = 온도; 이 .humidity = 습도; () notifyObserver; } }
관찰자 A (현상태 간판)
패키지 com.study.headfirst.oberver을; / ** * 현재 관찰 발표 : 온도 표시 * * @author의 MDL * @date 2019년 12월 2일 * / 공용 클래스 CurrentConditionsDisplay의 구현 DisplayElement, 관찰자 { 개인 플로트 온도; 공공 제목 weatherData; 공공 CurrentConditionsDisplay (주제 weatherData) { 이 .weatherData = weatherData; weatherData.registerObserver ( 이 ); } @보수 공용 무효 표시 () { 에서 System.out.println ( "현재 상태 ----- 현재 온도"+ TEMP); } / * (비 자바 독) * @see com.study.headfirst.oberver.Observer # 업데이트 (플로트) * / @보수 공용 공극 업데이트 ( 유동 온도, 플로트 습도) { // TODO 자동 생성 방법 스텁 이 .temp = 온도; 디스플레이(); } }
관찰자 B (일기 예보 간판) :
패키지 com.study.headfirst.oberver을; 수입 com.study.headfirst.oberver.DisplayElement; 수입 com.study.headfirst.oberver.Observer; / ** * 일기 예보 : 온도 표시, 습도 * * @author의 MDL * @date 2019년 12월 9일 * / 공용 클래스 ForcastDisplay의 구현 DisplayElement, 관찰자 { 개인 플로트 온도; 개인 플로트 습도; 공공 제목 weatherData; 공공 ForcastDisplay (주제 weatherData) { 이 .weatherData = weatherData; weatherData.registerObserver ( 이 ); } @보수 공용 무효 표시 () { 에서 System.out.println ( "일기 예보 ----- 현재 온도 :"+ 임시 + "현재 습도 :"+ 습도); } / * (비 자바 독) * @see com.study.headfirst.oberver.Observer # 업데이트 (플로트) * / @보수 공용 공극 업데이트 ( 유동 온도, 플로트 습도) { // TODO 자동 생성 방법 스텁 이 .temp = 온도; 이 .humidity = 습도; 디스플레이(); } }
테스트 :
패키지 com.study.headfirst.oberver을; / ** * 관찰자 모드 * 1. 등록 테마, 제거, 통지 * 2. 통지를 수신 한 후, 관찰자 작동 * * @author의 MDL * @date 2019년 12월 2일 * / 공용 클래스 테스트 { / ** * @param의 인수 * / 공공 정적 무효 메인 (문자열 []에 args) { // TODO 자동 생성 방법 스터브 WeatherData 대상 = 새로운 WeatherData (); CurrentConditionsDisplay의 CCD는 = 새로운 CurrentConditionsDisplay (주제); ForcastDisplay forcastDisplay = 새로운 ForcastDisplay (대상); subject.setMeasurements (27F, 80F); 에서 System.out.println ( "==================================" ); subject.setMeasurements (35F, 60F); } }