Latest web development tutorials

옵저버 패턴

객체 사이의 많은 관계가있는 경우, 관찰자 ​​패턴 (옵저버 패턴)를 사용합니다. 개체가 수정 될 때 예를 들어, 자동으로 종속 객체를 통지합니다. 관찰자 패턴은 행동 패턴에 속한다.

소개

의도 : 오브젝트의 상태가 변경 될 때 일대의 개체 간 종속성을 정의에 종속 모든 개체는 통지 자동 갱신된다.

다른 목적의 문제의 객체 변경 통지의 상태뿐만 아니라 계정에 사용 및 낮은 결합의 용이성을 고려하여 협업의 높은 수준을 보장: 주로 해결한다.

때 사용하는 방법 : 객체 (대상 객체) 상태를 변경, 모든 종속 오브젝트 (객체의 관찰자가), 방송 통지를 통보됩니다.

해결 방법 : 사용 객체 지향 기술을이 의존성이 약화 될 수있다.

키 코드 : 추상 클래스는 ArrayList에 저장 관찰자가 있습니다.

적용 예 : 1, 경매, 경매가 최고 가격을 관찰 한 다음 다른 입찰자에게 입찰을 알립니다.2, 여행 레드 보이 부처님, 부처님 물이 오래 거북이 제의에 민감한 반응의 바닥을 통해 유출 웨스트 Wukong 내부 요청 항복에,이 거북은 관찰자, 그는 그 행동 부처님의 물을 관찰했다.

장점 : (1)는 관찰자와 관찰 된 결합은 추상적이다.도 2를 참조하면, 트리거 메카니즘을 확립한다.

단점 : 관찰 된 개체가 직접 및 간접 관찰자가 많이있는 경우 1, 그것은 모든 관찰자에게 통지합니다 많은 시간을 보내고 있습니다.관찰자와 관찰 대상 사이의 순환 종속성이있는 경우 (2)는, 그 사이에 순환 호출을 트리거 할 대상을 관찰, 시스템 충돌을 일으킬 수 있습니다. 3, 관찰자 ​​모드가 시청자가 관객 방법 관측 된 변화입니다 알려주하는 메커니즘은 없지만, 그냥 관찰 대상 변경을 알고있다.

사용 시나리오 : 1, 복수의 서브 클래스의 일반적인 방법과 동일한 논리.도 2를 참조하면, 중요한 복잡한 방법은 템플릿 방법으로 간주 될 수있다.

참고 : 1, JAVA 이미 관찰자 모드 지원 클래스가 있습니다.2, 순환 참조를 방지 할 수 있습니다. 실행 순서는, 시청자가 시스템 오류 붙어 일으킬 수있는 경우 (3)는 일반적으로 비동기 모드를 사용한다.

실현

세 개의 클래스 제목, 옵저버 및 클라이언트를 사용하여 관찰자 패턴입니다. 물체와 관찰자와 클라이언트 개체에 따라 객체에서 클라이언트 솔루션 묶여 결합 된 관찰자 방법이다. 우리는주제 클래스,관찰자 추상 클래스를 생성하고 엔티티 클래스 추상옵저버 클래스를확장합니다.

ObserverPatternDemo,주제 클래스 개체와 개체를 사용하여 우리의 데모 클래스는 옵저버 패턴을 보여합니다.

관찰자 패턴 UML 다이어그램

1 단계

주제 범주를 만듭니다.

Subject.java

수입 인 java.util.ArrayList;
가져 오기를 java.util.List;

공용 클래스 주제 {
	
   개인 목록 <옵저버> 관찰자 
      = 새로운 ArrayList를 <옵저버> ();
   개인 INT 상태;

   공공 INT의 getState () {
      상태를 반환;
   }

   공공 무효 setState를 (INT 상태) {
      this.state = 상태;
      notifyAllObservers ();
   }

   공공 무효 {(옵저버 옵저버를) 연결
      observers.add (관찰자);		
   }

   공공 무효 notifyAllObservers () {
      대한 (관찰자 관찰자 : 관찰자) {
         observer.update ();
      }
   } 	
}

2 단계

옵저버 클래스를 만듭니다.

Observer.java

공개 추상 클래스 관찰자 {
   주제 주제를 보호;
   공개 추상 무효 업데이트 ();
}

3 단계

관찰자 엔티티 클래스를 만듭니다.

BinaryObserver.java

공용 클래스 BinaryObserver는 옵저버를 {확장

   공공 BinaryObserver (주제 대상) {
      this.subject = 제목;
      this.subject.attach (이);
   }

   @Override
   공공 무효 업데이트 () {
      에서 System.out.println ( "이진 문자열" 
      Integer.toBinaryString + (subject.getState ())); 
   }
}

OctalObserver.java

공용 클래스 OctalObserver는 옵저버를 {확장

   공공 OctalObserver (주제 대상) {
      this.subject = 제목;
      this.subject.attach (이);
   }

   @Override
   공공 무효 업데이트 () {
     에서 System.out.println ( "진수 문자열" 
     Integer.toOctalString + (subject.getState ())); 
   }
}

HexaObserver.java

공용 클래스 HexaObserver는 옵저버를 {확장

   공공 HexaObserver (주제 대상) {
      this.subject = 제목;
      this.subject.attach (이);
   }

   @Override
   공공 무효 업데이트 () {
      ( "진수 문자열"에서 System.out.println 
      Integer.toHexString + (subject.getState ()) .toUpperCase ()); 
   }
}

4 단계

대상과관찰자 엔티티 객체를 사용합니다.

ObserverPatternDemo.java

공용 클래스 ObserverPatternDemo {
   공공 정적 무효 메인 (문자열 []에 args) {
      주제 대상 = 새로운 주제 ();

      새로운 HexaObserver (대상);
      새로운 OctalObserver (대상);
      새로운 BinaryObserver (대상);

      에서 System.out.println ( "첫 번째 상태 변경 : 15");	
      subject.setState (15);
      에서 System.out.println ( "제 2 상태 변화 : 10");	
      subject.setState (10);
   }
}

5 단계

출력을 확인합니다.

첫 번째 상태 변경 : 15
진수 문자열 : F
진수 문자열 : 17
이진 문자열 : 1111
두 번째로 상태 변화 : 10
진수 문자열 :
진수 문자열 : 12
이진 문자열 : 1010