옵저버 패턴
객체 사이의 많은 관계가있는 경우, 관찰자 패턴 (옵저버 패턴)를 사용합니다. 개체가 수정 될 때 예를 들어, 자동으로 종속 객체를 통지합니다. 관찰자 패턴은 행동 패턴에 속한다.
소개
의도 : 오브젝트의 상태가 변경 될 때 일대의 개체 간 종속성을 정의에 종속 모든 개체는 통지 자동 갱신된다.
다른 목적의 문제의 객체 변경 통지의 상태뿐만 아니라 계정에 사용 및 낮은 결합의 용이성을 고려하여 협업의 높은 수준을 보장: 주로 해결한다.
때 사용하는 방법 : 객체 (대상 객체) 상태를 변경, 모든 종속 오브젝트 (객체의 관찰자가), 방송 통지를 통보됩니다.
해결 방법 : 사용 객체 지향 기술을이 의존성이 약화 될 수있다.
키 코드 : 추상 클래스는 ArrayList에 저장 관찰자가 있습니다.
적용 예 : 1, 경매, 경매가 최고 가격을 관찰 한 다음 다른 입찰자에게 입찰을 알립니다.2, 여행 레드 보이 부처님, 부처님 물이 오래 거북이 제의에 민감한 반응의 바닥을 통해 유출 웨스트 Wukong 내부 요청 항복에,이 거북은 관찰자, 그는 그 행동 부처님의 물을 관찰했다.
장점 : (1)는 관찰자와 관찰 된 결합은 추상적이다.도 2를 참조하면, 트리거 메카니즘을 확립한다.
단점 : 관찰 된 개체가 직접 및 간접 관찰자가 많이있는 경우 1, 그것은 모든 관찰자에게 통지합니다 많은 시간을 보내고 있습니다.관찰자와 관찰 대상 사이의 순환 종속성이있는 경우 (2)는, 그 사이에 순환 호출을 트리거 할 대상을 관찰, 시스템 충돌을 일으킬 수 있습니다. 3, 관찰자 모드가 시청자가 관객 방법 관측 된 변화입니다 알려주하는 메커니즘은 없지만, 그냥 관찰 대상 변경을 알고있다.
사용 시나리오 : 1, 복수의 서브 클래스의 일반적인 방법과 동일한 논리.도 2를 참조하면, 중요한 복잡한 방법은 템플릿 방법으로 간주 될 수있다.
참고 : 1, JAVA 이미 관찰자 모드 지원 클래스가 있습니다.2, 순환 참조를 방지 할 수 있습니다. 실행 순서는, 시청자가 시스템 오류 붙어 일으킬 수있는 경우 (3)는 일반적으로 비동기 모드를 사용한다.
실현
세 개의 클래스 제목, 옵저버 및 클라이언트를 사용하여 관찰자 패턴입니다. 물체와 관찰자와 클라이언트 개체에 따라 객체에서 클라이언트 솔루션 묶여 결합 된 관찰자 방법이다. 우리는주제 클래스,관찰자 추상 클래스를 생성하고 엔티티 클래스 추상옵저버 클래스를확장합니다.
ObserverPatternDemo,주제 클래스 개체와 개체를 사용하여 우리의 데모 클래스는 옵저버 패턴을 보여합니다.
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