'발행/구독(Publish/Subscribe) 모델'로도 알려져 있다.
e.g. 모델/뷰 패러다임
public interface Subject {
public void registerObserver(Observer o); /* 옵저버 등록 메소드*/
public void removeObserver(Observer o); /* 옵저버 제거 */
public void notifyObservers(); /* 옵저버에 내용 전달 */
}
public interface Observer {
public void update(int I_info); /* 정보 갱신 */
}
import java.util.*;
public class IntData implements Subject
private ArrayList<Observer> observers; /* 옵저버를 등록하고 관리 할 목록배열 */
private int I_info; /* 갱신에 사용 할 데이터 */
/** 주제클래스 생성자(옵저버리스트를 생성) */
public IntData() {
this.observers = new ArrayList<Observer>();
}
/** 옵저버를 등록 */
public void registerObserver(Observer o) {
try {
observers.add(o);
} catch( Exception e ) {
System.out.println("Error");
}
}
/** 옵저버 제거 */
public void removeObserver( Observer o ) {
int i = observers.indexOf(o);
if(i >= 0){ observers.remove(o); }
}
/** 옵저버를 갱신 */
public void notifyObservers() {
try {
for( int i = 0 ; i < observers.size(); i++){
Observer observer = observers.get(i);
observer.update(I_info);
}
}catch( Exception e ) { System.out.println("Error"); }
}
/** 데이터를 설정(변경시) */
public void setMesurements(int info) {
this.I_info = info;
notifyObservers();
}
}
public class DisplayData implements Observer {
private int I_info;
private IntData intData; /* 주제객체 */
/** 생성자(주제객체의 데이터를 입력받고, 주제객체에 자신의 존재를 알림) */
public DisplayData(IntData intData) {
try {
this.intData = intData;
intData.registerObserver(this); /* 클래스 생성시 주제 등록 */
} catch( Exception e ) { System.out.println("Error"); }
}
/** 업데이트 메소드 */
public void update( int I_info ) {
this.I_info = I_info;
System.out.println("Currnet Data is "+I_info);
}
}
public class Simulator {
public static void main( String[] args ) {
IntData intData = new IntData();
try{
DisplayData displayData = new DisplayData(intData);
intData.setMesurements(20);
..
} catch( Exception e ) {
System.out.println("Error");
} finally { System.out.println("End"); }
}
}