의 15: 관찰자 모델
5285 단어 디자인 모드
그 정 의 는 다음 과 같다.
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
대상 간 의 한 쌍 이상 의 의존 관 계 를 정의 하여 대상 이 상 태 를 바 꿀 때마다 모든 의존 대상 이 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
관찰자 모드 의 캐릭터 이름:
1, Subject 피 관찰자
피 관찰자 가 반드시 실현 해 야 할 직책 을 정의 하려 면 반드시 동태 적 으로 관찰 자 를 증가 하고 삭제 할 수 있어 야 한다. 이것 은 보통 추상 적 인 유형 이나 실현 유형 으로 피 관찰자 로 서 반드시 실현 해 야 할 직책 만 완성 해 야 한다. 즉, 관리자 와 관찰자 에 게 알려 야 한다.
2, Observer 관찰자
관찰자 가 메 시 지 를 받 은 후 즉시 update 를 진행 하여 받 은 정 보 를 처리 합 니 다.
3, Concrete Subject 의 구체 적 인 피 관찰자
피 관찰자 자신의 업무 논 리 를 정의 하 는 동시에 그 사건 에 대해 통지 하 는 것 을 정의 합 니 다.
4, ConcreteObserver 구체 적 인 관찰자
일반 템 플 릿 코드:
public interface Observer {
//
public void update();
}
public class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println(" , ...");
}
}
public abstract class Subject {
//
private Vector<Observer> observers = new Vector<Observer>();
//
public void addObserver(Observer o) {
this.observers.add(o);
}
//
public void delObserver(Observer o) {
this.observers.remove(o);
}
//
public void notifyObservers() {
for (Observer o : observers) {
o.update();
}
}
}
public class ConcreteSubject extends Subject {
//
public void doSomething() {
// do something...
System.out.println("I do something...");
super.notifyObservers();
}
}
public class Client {
public static void main(String[] args) {
//
ConcreteSubject subject = new ConcreteSubject();
//
Observer obs = new ConcreteObserver();
//
subject.addObserver(obs);
//
subject.doSomething();
}
}
관찰자 모드 의 장점:
1. 관찰자 와 피 관찰자 간 은 추상 적 인 결합 이다.
이렇게 하면 관찰 자 를 늘 리 든 피 관찰 자 를 늘 리 든 확장 하기 쉽 고 자바 에서 이미 실 현 된 추상 적 인 층 의 정 의 는 시스템 확장 에 더욱 능숙 하 다.
2. 메커니즘 을 제외 하고
관찰자 모드 의 단점:
관찰자 모델 은 개방 효율 과 운행 효율 문 제 를 고려 해 야 한다. 피 관찰자, 여러 관찰자, 개방 과 디 버 깅 은 비교적 복잡 하 다.자바 에서 메시지 알림 모드 는 순서대로 실 행 됩 니 다. 이런 상황 에서 보통 비동기 방식 의 메시지 알림 체 제 를 사용 합 니 다.
다단 계 촉발 의 효율 은 더욱 걱정스럽다.이 럴 때 조심해 라.
관찰자 모드 사용 필드:
1. 관련 행위 장면.주의해 야 할 것 은 관련 행 위 는 조합 관계 가 아니 라 분리 할 수 있다 는 것 이다.
2, 이벤트 다단 계 촉발 필드
3. 메시지 큐 의 처리 메커니즘 과 같은 시스템 의 메시지 교환 장면 확대
주의사항:
질문
한 가지 만 주의 하면 경험 과 건의 에 따라 한 관찰자 모델 에서 가장 많은 대상 이 관찰자 이자 피 관찰자 가 나타난다. 즉, 소식 을 최대 한 번 (두 번 전달) 전달 하 는 것 이다.
비동기 처리 문제:
여러 관찰자 가 있 을 때 관찰자 가 처리 하 는 시간 이 길 면 비동기 방식 을 사용 해 야 한다. 이 럴 때 스 레 드 안전 과 대기 열 문 제 를 고려 해 야 한다. 이 럴 때 Message Queue 를 참고 하면 더욱 깊이 이해 할 수 있다.
관찰자 모드 의 확장 모드:
JDK 에서 기 존의 Observable 과 Observer 두 가지 종 류 를 제공 해 주 었 습 니 다. 그 사이 에 사용 하면 위의 코드 를 크게 간소화 할 수 있 습 니 다. 이 때 는 추상 적 인 Subject 와 자신 이 정의 한 Observer 류 가 필요 없습니다.
public class ConcreteSubject extends Observable {
//
public void doSomething() {
// do something...
System.out.println("I do something...");
super.setChanged();
super.notifyObservers();
}
}
public class ConcreteObserver implements java.util.Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("--- , JDK Observer ---");
}
}
프로젝트 의 실제 관찰자 모드:
1. 관찰자 와 피 관찰자 간 의 소식 소통
일반적인 방법 은 관찰자 중의 update 방법 은 두 개의 매개 변수 가 있 는데 하 나 는 피 관찰자 이 고 하 나 는 DTO 이 며 DTO 는 순결 한 자바 빈 으로 피 관찰자 가 생산 하고 관찰자 가 소비 하 는 것 이다.JDK 의 Observer 인터페이스 에서 알 수 있 습 니 다.
원 격 전송 을 고려 하면 일반 메시지 형식 은 XML 또는 JSON 형식 으로 전달 된다.
2, 관찰자 응답 방식:
일반적으로 다 중 스 레 드 를 시작 하여 관찰자 에 게 알 리 는 것 이다.
3. 피 관찰 자 는 가능 한 한 스스로 결정 한다.
피 관찰자 의 상태 가 바 뀌 면 반드시 관찰자 에 게 알려 야 합 니까?꼭 그렇지 는 않 습 니 다. 일반적으로 피 관찰자 의 업무 논리 doSomething 방법 에 대해 재 업로드 합 니 다. 예 를 들 어 doSomething (boolean is Notify Obs) 방법 을 추가 하여 관찰자 에 게 알 릴 지 여 부 를 결정 합 니 다. 메시지 가 관찰자 에 게 도 착 했 을 때 이 소식 을 처리 할 지 여 부 를 판단 하 는 것 이 아 닙 니 다.
최 적 실천:
관찰자 모델 은 실천 항목 과 생활 에서 자주 나타난다. 몇 가지 예 를 들 어 설명 한다.
1, 파일 시스템
디 렉 터 리 작은 새 파일 을 만 들 면 디 렉 터 리 관리자 에 게 디 렉 터 리 를 추가 하 라 고 알 리 고 디스크 관리자 에 게 1K 공간 을 줄 이 라 고 알 립 니 다.
라디오
방송국 이 방송 하고 있 으 니, 너 는 두 개의 라디오 를 켜 서 들 을 수 있다. 방송국 은 피 관찰자 이 고, 라디오 는 관찰자 이다.
본인 의 블 로 그 는 이미 이 사 했 습 니 다. 새 주 소 는 다음 과 같 습 니 다. http://yidao620c.github.io/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.