이 기사에서는 기상국의 고온 경고 기능을 구현하기 위해 관찰자 모드의 사용에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
1. 패턴 정의
게시/구독 모드라고도하는 옵저버 모드. 관찰자 패턴은 객체 간의 일대일 의존성을 정의합니다. 객체의 상태가 변경되면 이에 의존하는 모든 객체에 알림을 받고 자동으로 업데이트됩니다.
2. 모델의 예
1 패턴 분석
우리는이 모델을 설명하기 위해 기상국의 고온 경고를 빌려줍니다.
2 관찰자 패턴 정적 클래스 다이어그램
3 코드 예제
3.1 옵저버 인터페이스 -iobserver
package com.demo.observer; import com.demo.subject.isubject;/** * 옵저버 인터페이스 * @author */public interface iobserver {// 업데이트 메소드 공개 void update (isubject subud);}3.2 주제 인터페이스-방사판
package com.demo.subject; import com.demo.observer.iobserver;/** * 주제 인터페이스 (Observer) * * @author */public interface isubject {/** * adderver * * @param observer * @return */public boolean add (iobserver); / ** * 옵저버 삭제 * * @Param Observer * @return */ public boolean remain (iobserver observer); / *** 모든 관찰자에게 데이터를 업데이트하도록 통지*/ public void notifyallobserver (); / ** * 온도 값을 설정 * * @Param 온도 */ public void setemperature (플로트 온도); / ** * 온도 경고 받기 * * @return */ public String empertureReport ();}3.3 특정 주제에서 주제 구현
package com.demo.subject;import java.util.Iterator;import java.util.Vector;import com.demo.observer.IObserver;/** * Theme implementation class (observer) * * @author * */public class Subject implements ISubject { // Temperature/** * (I) High temperature yellow warning signal* * Standard: The maximum daily temperature will be above 35℃ for three 연속 일. * * (2) 고온 주황색 경고 신호 * * 표준 : 최대 온도는 24 시간 이내에 37 ℃ 이상으로 상승합니다. * * (iii) 고온 빨간색 경고 신호 * * 표준 : 최대 온도는 24 시간 이내에 40 ℃ 이상으로 상승합니다. */ 개인 플로트 온도; // 조기 경보 수준 개인 문자열 경고; // 옵저버 목록 저장 비공개 최종 벡터 <iobserver> 벡터; / *** 구성 메소드 초기화 관찰자 목록*/ public subject () {vector = new vector <iobserver> (); } / *** 추가 관찰자* / public boolean add (iobserver observer) {if (observer! = null &&! vector.contains (Observer)) {return vector.add (observer); } false를 반환합니다. } / *** 옵저버 제거* / public boolean remove (iobserver observer) {return vector.remove (옵저버); } / *** 모든 관찰자에게 데이터를 업데이트하도록 통지* / public void notifyallobserver () {System.out.println ( "============ 기상 부서는 고온을 릴리스합니다. (iterator.hasnext ()) {(iterator.next ()). update (this)}; 개인 메소드는 온도 값에 따라 경고 수준을 설정하고 모든 관찰자* / private void invoke () {if (this.temperature> = 35 && this. "else"; this.temperature> = 37 && Temperature <40) {this.temperature> = 40) {warninglevel = "red} // */ public void settemperature (float lestring) {this.temperature = this.invoke ()*/ public string letome "{return"온도;3.4 개인 옵저버 직원 오브 서버
package com.demo.observer; import com.demo.subject.isubject;/** * 개별 사용자 옵저버 * @author */public class personobserver는 iobserver {public void update (isubject update) {system.out.println (개인이 높은 온도 경고 : " + subject.tempererport ()); }}3.5 정부 관찰자 정부 관측자
package com.demo.observer; import com.demo.subject.isubject;/** * 정부 사용자 옵저버 * @author */public class GovernmentObserver 구현 iobserver {public void update (isubject update) {System.out.println ( "정부 부서가 고온 경고를 받았다 :" + 주제 .Tempererperport ()); }}3.6 CompanyObserver
package com.demo.observer; import com.demo.subject.isubject;/** * Enterprise and Institutions 사용자 관찰자 * @author */public class CompanyObserver는 iobserver {public void update (isubject) {system.out.println ( "Enterprises 및 Institutions 수신 (")); }}3.7 시스템이 클라이언트를 실행하기 시작하십시오
package com.demo;import java.util.Random;import com.demo.observer.CompanyObserver;import com.demo.observer.GovernmentObserver;import com.demo.observer.PersonObserver;import com.demo.subject.ISubject;import com.demo.subject.Subject;/** * Client application* * @author */public class client {/** * @param args */public static void main (String [] args) {// 주제 객체 생성 isubject gourde = new aville (); // 엔터프라이즈 및 기관 주제의 관찰자 추가. // 정부 사용자 주제의 옵저버 추가 (새로운 GovernmentObserver ()); // 개별 사용자 피사체의 옵저버 추가 (new personObserver ()); 랜덤 random = new random (); int i = 0; while (++ i <10) {// 랜덤 온도 대상을 설정합니다. }}}4 실행 결과
========= 기상 부서는 노란색 고온 경보를 발행합니다! ======
기업과 기관은 고온 경고를받습니다 : 온도 : 35.0
정부 부서는 고온 경고를 받았습니다 : 온도 : 35.0
개인은 고온 경고를받습니다 : 온도 : 35.0
========= 기상 부서는 고온에 대한 적색 경보를 발행합니다! ======
기업과 기관은 고온 경고를받습니다 : 온도 : 43.0
정부 부서는 고온 경고를 받았습니다 : 온도 : 43.0
개인은 고온 경고를받습니다 : 온도 : 43.0
========= 기상 부서는 고온 주황색 알람을 발행합니다! ======
기업과 기관은 고온 경고를받습니다 : 온도 : 37.0
정부 부서는 고온 경고를 받았습니다 : 온도 : 37.0
개인은 고온 경고를받습니다 : 온도 : 37.0
3.이 모델의 디자인 원리
1 "개방형"원칙
2 단일 책임 원칙
3. 의존성 반전의 원리
4. 행사를 사용하십시오
1 초록 모델에 두 가지 측면이있는 경우, 그 중 하나는 다른 측면에 의존하며 독립 객체에 캡슐화되어 서로 독립적으로 변경 및 다중화되어야합니다.
2 시스템에서 객체를 변경하려면 다른 객체의 내용을 동시에 변경해야하지만 몇 개의 개체가 변경 될 객체 수를 모릅니다.
3 객체의 변경을 다른 객체에 알리기 위해 해당 변경을 수행해야하지만 객체에 알림을 판단 할 수는 없습니다.
5. "데이터 풀"정적 클래스 다이어그램
소위 "푸시 데이터"는 관찰 된 객체가 변경되면 관련 데이터가 매개 변수를 통해 관찰자에게 전달되어 관찰자 "푸시 데이터"를 관찰자에게 형성한다는 것을 의미합니다. 정적 클래스 다이어그램은 다음과 같습니다.
6. "데이터 풀"정적 클래스 다이어그램
소위 "풀 데이터"인 관찰자 객체는 관찰되는 객체의 인스턴스에 대한 참조를 포함합니다. 관찰되는 객체가 변경되면 데이터가 관찰자에게 전달되지 않습니다. 관찰자는 관찰되는 객체의 참조에 따라 관련 데이터를 적극적으로 얻습니다. 이는 관찰자가 관찰되는 객체에서 적극적으로 "데이터를 끌어냅니다"를 형성합니다. 정적 클래스 다이어그램은 다음과 같습니다.
더 많은 Java 관련 컨텐츠를 위해이 사이트에 관심이있는 독자는 "Java 객체 지향 프로그래밍에 대한 소개 및 고급 튜토리얼", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java Operation Dom Node Skills 요약", "Java 파일 및 디렉토리 운영 기술 요약"및 "Java Cache Cache 운영 기술 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.