주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다.
public interface Observer {
public abstract void update();
}
public abstract class Observable {
public List<Observer> list=new ArrayList<>();
public void subscribe(Observer observer){
list.add(observer);
}
public void disposable(Observer observer){
list.remove(observer);
}
public void notifyObservers(){
for(Observer o:list){
o.update();
}
}
}
public class MovieStore extends Observable {
private List<String> movies=new ArrayList<>();
//새로운 영상이 추가되면 구독자들에게 통보
public void add(String movie){
movies.add(movie);
notifyObservers();
}
public List<String> getMovieList(){
return movies;
}
}
public class Hong implements Observer {
private MovieStore movieStore;
public Hong(MovieStore movieStore){
this.movieStore=movieStore;
}
@Override
public void update() {
System.out.println("Hong님 : "+"새로운 영화가 무비스토어에 들어왔습니다.");
}
public List<String> getMovieList(){
return movieStore.getMovieList();
}
}
public class Minsu implements Observer{
private MovieStore movieStore;
public Minsu(MovieStore movieStore){
this.movieStore=movieStore;
}
@Override
public void update() {
System.out.println("Minsu님 : "+"새로운 영화가 무비스토어에 들어왔습니다.");
}
public List<String> getMovieList(){
for(String s:movieStore.getMovieList()){
System.out.println(s);
}
return movieStore.getMovieList();
}
}
public class Main {
public static void main(String[] args){
//영화를 판매하는 스토어
MovieStore movieStore=new MovieStore();
//새로운 영화가 들어올경우 알림을 받고싶은 사람들
Hong hong=new Hong(movieStore);
Minsu minsu=new Minsu(movieStore);
//알림을 원하는 두 사람이 스토어에 구독 신청을 했다
movieStore.subscribe(hong);
movieStore.subscribe(minsu);
movieStore.add("바람과 함께 사라지다");
System.out.println("--------------------");
movieStore.add("해리포터");
System.out.println("--------------------");
//민수가 알림을 받고 목록을 받아본다
System.out.println("민수가 목록을 출력합니다");
minsu.getMovieList();
}
}
Hong님 : 새로운 영화가 무비스토어에 들어왔습니다.
Minsu님 : 새로운 영화가 무비스토어에 들어왔습니다.
--------------------
Hong님 : 새로운 영화가 무비스토어에 들어왔습니다.
Minsu님 : 새로운 영화가 무비스토어에 들어왔습니다.
--------------------
민수가 목록을 출력합니다
바람과 함께 사라지다
해리포터