의 15: 관찰자 모델

5285 단어 디자인 모드
Observer Pattern 관찰자 모드 는 게시 / 구독 (Publish / Subscribe) 모드 라 고도 하 는데 프로젝트 에서 자주 사용 하 는 모드 입 니 다.
그 정 의 는 다음 과 같다.
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/

좋은 웹페이지 즐겨찾기