JAVA-관찰자 디자인 모델
관찰자 모드(Observer)는 관찰자 와 관찰 대상 을 완벽 하 게 분리 한다.예 를 들 어 사용자 인터페이스 는 관찰자 로 서 업무 데 이 터 는 피 관찰자 이 고 사용자 인터페이스 는 업무 데이터 의 변 화 를 관찰 하 며 데이터 변 화 를 발견 하면 인터페이스 에 나타난다.대상 을 대상 으로 디자인 하 는 원칙 은 시스템 의 모든 유형 은 다른 측면 이 아니 라 특정한 기능 에 중점 을 두 는 것 이다.한 상대 가 한 가지 일 만 하고 그 를 잘 해 낸다.관찰자 모드 는 모듈 간 에 뚜렷 한 경 계 를 긋 고 응용 프로그램의 유지 가능성 과 중용 성 을 향상 시 켰 다.
관찰자 디자인 모델 은 대상 간 의 한 쌍 의 다 중 의존 관 계 를 정의 하여 한 대상 의 상태 가 변화 할 때 그 대상 에 의존 하 는 모든 대상 이 알림 을 받 고 자동 으로 새로 고침 되도록 한다.
구현 방식:
관찰자 모델 은 많은 실현 방식 이 있 는데 근본적으로 말하자면 이 모델 은 반드시 두 가지 역할 을 포함해 야 한다.즉,관찰자 와 피 관찰 대상 이다.방금 의 예 에서 업무 데 이 터 는 관찰 대상 이 고 사용자 인터페이스 는 관찰자 이다.관찰자 와 피 관찰자 사이 에'관찰'의 논리 적 관련 이 존재 하고 피 관찰자 가 변 할 때 관찰 자 는 이러한 변 화 를 관찰 하고 이에 상응하는 호응 을 한다.만약 에 사용자 인터페이스,업무 데이터 간 에 이러한 관찰 과정 을 사용 하면 인터페이스 와 데이터 간 에 경 계 를 분명히 할 수 있 고 응용 프로그램의 수요 가 변화 한다 고 가정 할 수 있다.인터페이스의 표현 을 수정 하고 하나의 사용자 인터페이스 만 다시 구축 해 야 한다.업무 데 이 터 는 변화 가 발생 하지 않 아 도 된다.
관찰자
(Observer)는 관찰 대상(Subject)에 자신 을 등록 하고,관찰 대상 은 관찰 자 를 하나의 용기(Container)에 저장한다.
관찰 을 받다
관찰 대상 에 게 어떤 변화 가 생 겼 습 니 다(그림 속 SomeChange).용기 에서 등 록 된 모든 관찰 자 를 받 아 변 화 를 관찰자 에 게 알 립 니 다.
관찰 을 취소 하 다
관찰 자 는 피 관찰자 에 게 관찰 을 취소 하고 피 관찰자 가 용기 에서 관찰 자 를 제거 하 라 고 말 했다.
관찰자 가 피 관찰자 의 용기 에 자신 을 등록 할 때 피 관찰 자 는 관찰자 의 구체 적 인 유형 에 관여 하지 말고 관찰자 의 인 터 페 이 스 를 사용 해 야 한다.이런 장점 은 프로그램 에 다른 관찰자 가 있다 고 가정 하면 이 관찰자 도 같은 인터페이스 로 이 루어 지면 된다 는 것 이다.피 관찰 자 는 여러 명의 관찰자 에 대응 할 수 있 고 피 관찰자 가 변화 가 생 겼 을 때 그 는 모든 관찰자 에 게 소식 을 일일이 알 릴 수 있다.구체 적 인 실현 이 아니 라 인 터 페 이 스 를 바탕 으로 한 다 는 점 은 프로그램 에 더욱 큰 유연성 을 제공 했다.
시범 코드:
관찰 된 캐릭터 추상 클래스 정의:
package test.edu.mainrole;
import java.util.ArrayList;
public abstract class AbsRole {
private ArrayList<IObserver> list = new ArrayList<IObserver>();
public void add(IObserver observer) {
list.add(observer);
}
public void delete(IObserver observer) {
list.remove(observer);
}
public void nodifyObservers(String newState) {
for (IObserver observer : list) {
observer.update(newState);
}
}
}
관찰 대상 캐릭터 하위 클래스:
package test.edu.mainrole;
public class Role extends AbsRole {
private String state;
public String getState() {
return state;
}
public void change(String nupdate) {
state = nupdate;
this.nodifyObservers(state);
}
}
정의 관찰자 인터페이스:
package test.edu.mainrole;
public interface IObserver {
public void update(String newState);
}
구체 적 인 관찰자:
package test.edu.mainrole;
public class ObserverObj1 implements IObserver{
private String observerState;
@Override
public void update(String state) {
observerState = state;
System.out.println(" 1 :" + observerState);
}
}
package test.edu.mainrole;
public class ObserverObj2 implements IObserver {
private String observerState;
@Override
public void update(String state) {
observerState = state;
System.out.println(" 2 :" + observerState);
}
}
테스트 클 라 이언 트:
package test.edu.mainrole;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Role subject = new Role();
IObserver observer1 = new ObserverObj1();
IObserver observer2 = new ObserverObj2();
subject.add(observer1);
subject.add(observer2);
subject.change("update!");
}
}
실행 결과:
관찰자 1 의 상 태 는:update!관찰자 2 의 상 태 는:update!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.