JAVA-관찰자 디자인 모델

관찰자 모드 )-구독(Subscribe)모드,모델-보기(View)모드,소스-청취 자(Listener)모드 또는 종속 자 모드)는 소프트웨어 디자인 모델 의 일종 이다.이런 모델 에서 하나의 목표 물건 은 그 에 의존 하 는 모든 관찰자 의 물건 을 관리 하고 그 자체 의 상태 가 바 뀔 때 주동 적 으로 통 지 를 한다.이것 은 보통 각 관찰자 가 제공 하 는 방법 을 통 해 이 루어 진다.이 모델 은 보통 사건 처리 시스템 을 실현 하 는 데 쓰 인 다.
관찰자 모드(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!

좋은 웹페이지 즐겨찾기