자바 디자인 모드 의 관찰자 모드

관찰자 모드 는 게시-구독(Publish/Subscribe)모드 라 고도 부 르 며 한 쌍 의 다 중 의존 관 계 를 정의 하여 여러 관찰자 대상 이 특정한 주제 대상 을 동시에 감청 하도록 한다.이 테마 대상 은 상태 가 변 할 때 모든 관찰자 대상 에 게 자동 으로 자신 을 업데이트 할 수 있 도록 알려 줍 니 다.하나의 시스템 을 일련의 상호 협력 유형 으로 나 누 는 것 은 매우 좋 지 않 은 부작용 이 있다.그것 은 바로 관련 대상 간 의 일치 성 을 유지 해 야 한 다 는 것 이다.우 리 는 일치 성 을 유지 하기 위해 각종 긴밀 한 결합 을 원 하지 않 는 다.이렇게 하면 유지,확장 과 재 활용 에 불편 을 가 져 올 수 있다.관찰자 모델 이 하 는 일 은 바로 결합 을 해제 하고 결합 하 는 쌍방 을 추상 에 의존 하 게 하 는 것 이지 구체 적 인 것 에 의존 하 게 하 는 것 이 아니다.
관찰자 모델 은 실제 에서 비교적 광범 위 하 게 응용 되 는 모델 이다.그 응용 장면 은 예 를 들 어 쌀 을 생산 하 는 공장 과 n 개의 쌀 을 판매 하 는 업 체,n 개의 업 체 가 먼저 이 공장 에 자신의 연락 처 를 등록 하고 공장 에서 일 정량의 쌀 을 생산 한 후에 연락처 에 따라 이 n 개의 업 체 에 게 물건 을 찾 으 라 고 통지 하 는 것 이다.이 예 에 서 는 관찰자 모드 의 등록(Attach)과 알림(Notify)을 사 용 했 습 니 다.즉,알림 자의 상태 가 바 뀌 었 을 때 각 관찰자 에 게 순서대로 알려 줍 니 다.
Subject 는 추상 적 인 알림 자 이 고 Observer 는 추상 적 인 관찰자 이다.만약 에 만 들 려 는 파생 류 가 바람 과 말 과 소 가 서로 미 치지 못 하 는 대상 이 라면 인 터 페 이 스 를 이용 하여 몇 가지 똑 같은 방법 을 실현 하 는 것 을 고려 할 수 있다.  

자바 코드 는 다음 과 같 습 니 다:

abstract class Subject {
  private ArrayList<Observer> observersList = new ArrayList<Observer>();
  
  // add observers
  public void Attach(Observer ob) {
    observersList.add(ob);
  }
  
  // remove observers
  public void Detach(Observer ob) {
    observersList.remove(ob);
  }
  
  public void Notify()
  {
    for (Observer ob : observersList) {
      ob.Update();
    }
  }
}

abstract class Observer {
  public abstract void Update();
}

public class ConcreteObserver extends Observer {
  private String name;
  private String observerStatus;
  private ConcreteSubject subject;
  
  public ConcreteObserver(ConcreteSubject subject, String name)
  {
    this.subject = subject;
    this.name = name;
  }
  
  public void Update() 
  {
    observerStatus = subject.getSubjectStatus();
  }  
}

public class ConcreteSubject extends Subject {
  private String subjectStatus;

  public String getSubjectStatus() {
    return subjectStatus;
  }

  public void setSubjectStatus(String subjectStatus) {
    this.subjectStatus = subjectStatus;
  }

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ConcreteSubject s = new ConcreteSubject();

    s.Attach(new ConcreteObserver(s, "X"));
    s.Attach(new ConcreteObserver(s, "Y"));
    s.Attach(new ConcreteObserver(s, "Z"));
    
    s.setSubjectStatus("Ready");
    s.Notify();
  }
}
상기 코드 에는 추상 적 인 관찰자 와 추상 적 인 알림 이 있다.Subject 의 상태 가 바 뀌 면 함 수 를 호출 하면 내부 에 등 록 된 관찰자 에 게 알 릴 수 있 습 니 다.이런 디자인 사상 은 평소에 도 흔히 볼 수 있 는 것 이다.예 를 들 어 처음에 언급 한 쌀 을 생산 하 는 공장 과 쌀 을 판매 하 는 업 체 등 이다.서점 에 있 는 어떤 책 이 품절 되 었 는데 도 고객 이 사고 싶 으 면 등록 을 할 수 있 고 물건 이 나 오 면 서점 주인 이 전 화 를 걸 어 책 을 사고 싶 은 고객 에 게 차례대로 알려 준다.이런 등록 체 제 는 다른 프로 그래 밍 기법 에서 도 많이 나타난다.예 를 들 어 프로그램 이 바 텀 라 이브 러 리 에 여러 개의 반전 함 수 를 등록 하고 조건 이 만족 하면 바 텀 라 이브 러 리 는 최상 위 에서 제공 하 는 반전 함 수 를 알려 준다.
상기 코드 는 자바 가 쓴 것 이 고 C++의 말 도 비슷 하 며 주로 Subject 가 Observer 를 저장 하 는 지침 입 니 다.그러나 C++는 메모리 방출 문 제 를 고려 해 야 합 니 다.Observer 자체 가 소각 되 려 면 Subject 의 Detach 함 수 를 호출 해 야 합 니 다.그렇지 않 으 면 업데이트 할 때 야 지침 을 사용 하여 crash 문 제 를 일 으 킬 수 있 습 니 다.Subject 를 사용 하여 Observer 의 수명 주 기 를 관리 하 는 것 을 고려 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기