관찰자 모드 / Observer

18793 단어 it디자인 모드
관찰자 모드 / Observer
의도 / 적용 필드:
관찰자 모델 의 목적 지 는 특정한 대상 (피 관찰자) 의 상태 가 변화 할 때 이 변 화 를 알 고 싶 은 다른 대상 (관찰자) 에 게 통 지 를 받 을 수 있다.
이 를 실현 할 수 있 는 디자인 방안 은 매우 많 지만 시스템 을 쉽게 재 활용 하기 위해 서 는 낮은 결합 도 를 가 진 디자인 방안 을 선택해 야 한다.
UML:
참가 자:
추상 관찰자 (Observer): 모든 관찰자 의 공공 인터페이스.업데이트 방법 (즉 update () 방법) 을 정의 합 니 다. 관찰 대상 의 상태 가 바 뀌 었 을 때 이 방법 은 피 관찰자 에 의 해 호출 됩 니 다
구체 적 인 관찰자 (ConcreteObserver): Observer 인 터 페 이 스 를 실현 합 니 다.update () 방법 을 구체화 하고 피 관찰자 의 상태 가 변 할 때 update () 방법 에서 해당 하 는 반응 을 합 니 다
추상 피 관찰자 (Observable): 피 관찰자 류 의 공공 인터페이스.일부 관리자 대상 을 정의 하 는 방법, 예 를 들 어 addObserver (), deleteObserver () 등 이 있 기 때문에 관찰자 대상 의 집합 을 유지 해 야 합 니 다.이 밖 에 논리 적 으로 '알림' 기능, 즉 notify () 방법 을 실현 하고 그 중에서 집합 중 관찰자 의 update () 방법 을 호출 하 는 '알림' 기능 도 필요 하 다.그러나 업데이트 () 를 언제 호출 할 지 는 구체 적 인 실현 에 따라 결정 되 기 때문에 notify () 방법 은 필수 가 아 닙 니 다
구체 적 인 피 관찰자 (Concrete Observable): Observable 인 터 페 이 스 를 실현 하고 모 이 는 방법 과 통 지 를 구체화 하 는 방법.관찰 상태 가 바 뀌 었 을 때 관찰자 의 update () 방법 을 호출 합 니 다
요점:
관찰자 모델 의 핵심 개념 은 피 관찰자 가 추상 적 인 관찰자 update () 방법 에 대한 호출 이다.이러한 '인터페이스' 만 을 위 한 프로 그래 밍 은 관찰자 와 피 관찰자 의 결합 성 을 낮 추어 서로 영향 을 주지 않 고 변화 하고 연역 할 수 있 게 한다.
통지 과정 중의 순환 호출 을 경계해 야 한다.이론 적 으로 하나의 유형 은 관찰자 이자 피 관찰자 일 수 있 고 피 관찰자 역할 을 할 수 있 으 며 그의 관찰자 가 모여 관찰자 로 서 의 자신 을 가 질 수 있 기 때문이다.이 때 는 update () 방법 에서 notify () 를 다시 바 꾸 지 않 고 순환 할 수 있 도록 해 야 합 니 다.
확장:
추상 피 관찰자 Observable 은 인터페이스 로 정의 해 야 하 는 것 이 아니 라 추상 류 로 정의 할 수도 있다.이 두 가지 선택 은 각각 다음 과 같은 장점 이 있다.
인터페이스 로 정의: 구체 적 인 피 관찰 자 는 자신의 방식 으로 관찰자 의 집합 을 유지 할 수 있 고 Vector 를 사용 할 수도 있 으 며 Hashtable 또는 다른 것 을 사용 할 수도 있 습 니 다.구체 적 으로 피 관찰 자 는 매우 유연성 이 있다
추상 류 로 정의: 이때 Observable 추상 류 로 모여 유지 하고 notify () 방법 도 추상 류 에서 이 루어 집 니 다.이렇게 하면 모든 구체 적 인 피 관찰자 들 이 더 이상 모 이 는 것 을 유지 하지 않 아 도 된다. 이것 은 비교적 편리 한 방법 이지 만 유연성 도 부족 하 다.구체 적 인 관찰자 가 많 고 모임 을 어떻게 유지 하 는 지 신경 쓰 지 않 는 다 면 좋 은 선택 이다
인 스 턴 스 적용:
Listener: AWT 를 사용 하여 데스크 톱 애플 리 케 이 션 을 만 들 때 어떤 Listener 를 사용 하여 창 이 벤트 를 감청 합 니 다.'감청' 과 '관찰' 의 원 리 는 같은 것 으로 어떤 사건 이 발생 했 을 때 감청 자 에 게 통지 하 는 것 이다.감청 은 관찰자 모델 의 특례 로 그 특이 한 점 은 두 가지 가 있다.
관찰 대상 은 '사건' 이다.관찰 모델 에서 통지 의 원동력 은 광범 위 하 게 이야기 하 는 변화 이 고 사건 은 특례 라 고 할 수 있다
통지 할 때 피 감청 자 는 사건 을 매개 변수 로 감청 자 에 게 전달한다.관찰자 모드 에 서 는 update () 방법 에 인자 가 필요 한 지 밝 히 지 않 았 습 니 다. 이것 은 필요 에 따라 정 해 졌 습 니 다. 있 을 수도 있 고 없 을 수도 있 습 니 다
관찰자 모델 은 '방송' 의 효 과 를 실 현 했 기 때문에 장면 이 비교적 광범 위 해 야 한다.
또한 자바 언어의 자바 util 라 이브 러 리 에 Observable 클래스 와 Observer 인 터 페 이 스 를 제공 하여 자바 언어 가 관찰자 모드 에 대한 지원 을 구성 했다.이 모드 를 사용 해 야 할 때 는 직접 사용 하 는 것 을 고려 할 수 있다.
예제 코드:
   [java]
// Source code from file:  ConcreteObservable.java

package designPatterns.Observer;

import java.util.Enumeration;
import java.util.Vector;

public class ConcreteObservable implements Observable {

private Vector obs = new Vector();

public void addObserver(Observer o) {
obs.add(o);
}

public void deleteObserver(Observer o) {
obs.remove(o);
}

public void notifyObservers() {
Enumeration enumeration = ((Vector)(obs.clone())).elements();
while(enumeration.hasMoreElements()) {
Observer oo = (Observer)(enumeration.nextElement());
oo.update();
//                      ((Observer)(enumeration.nextElement())).update();
}
}

public void demo() {
int count = 0;
while (count try {
Thread.sleep(1000);
notifyObservers();
} catch (Exception e) {
System.out.println(e);
}
}
}

}

// Source code from file:  ConcreteObserverA.java

package designPatterns.Observer;

public class ConcreteObserverA implements Observer {
public void update() {
System.out.println("ConcreteObserverA got updated.");
}
}

// Source code from file:  ConcreteObserverB.java

package designPatterns.Observer;

public class ConcreteObserverB implements Observer {
public void update() {
System.out.println("ConcreteObserverB got updated.");
}
}

// Source code from file:  Observable.java

package designPatterns.Observer;

public interface Observable {
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservers();
}

// Source code from file:  Observer.java

package designPatterns.Observer;

public interface Observer {
public void update();
}

// Source code from file:  User.java

package designPatterns.Observer;

public class User {
public static void main(String[] args) {
ConcreteObservable observable = new ConcreteObservable();
observable.addObserver(new ConcreteObserverA());
observable.addObserver(new ConcreteObserverB());
observable.demo();
}
}
[/java]

좋은 웹페이지 즐겨찾기