패턴 디자인 | 둘째 : 옵저버 패턴

정의 된 관찰자 패턴

  객체가 상태를 변경 많은 개체, 그래서 사이의 정의 종속성, 그 부양 가족이 알림을 자동으로 업데이트됩니다.

사용 시나리오

  게시 및 구독, 잡지의 공개 및 기타 마이크로 채널 번호를 알려

디자인 원칙

  디자인 객체와 작업 사이 느슨하게 결합 된 상호 작용

장점과 단점

  장점 :

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

}

 

추천

출처www.cnblogs.com/bloodthirsty/p/12010563.html