Observers and Observables

java.util.Observer 인터페이스와 java.util.Observerable클래스는 비교적 단순하지만 Java에서의 디자인패턴의 기본을 엿볼수 있는 모델이 될수 있겠다.

특정 오브젝트나 리소스(Observable)가 변경이 일어났을 경우여러개의 클라이언트(Observer) 들이 변경 내용을 통보 받을수 있도록 한다.

 

다음의 예제는 게시판(MessageBoard) 등록된 학생들에게 변경된 내용을 통보하는 예제이다. 따라서 게시판은 Observable을 상속하였으며 학생들은 Observer 인터페이스를 구현하였다

 

참고자료 : Interface as Callback [ http://stevenjsmin.tistory.com/19 ]

 

 

package ch11;

 

import java.util.Observable;

import java.util.Observer;

 

public class MessageBoard extends Observable {

       private String message;

 

       public String getMessage() {

              return message;

       }

 

       public void changeMessage(String message) {

              this.message = message;

              setChanged(); // 만일 너무 자주 변경이 일어나는 경우 문제가 될수 있기때문에 유연성을 제공하기 위한 메소드

              notifyObservers(message);

       }

 

       public static void main(String[] args) {

              MessageBoard board = new MessageBoard();

              Observer bob = new StudentA();

              Observer joe = new StudentA();

              Observer paul = new StudentB();

              Observer steven = new StudentB();

             

              //  Observable 구현한 객체들을 Observable.addObserver(Observer o)메소드를 통하여

              //  모두 등록하고 Observable.notifyObservers(Object arg)에서 등록된 모든 Observer들의 Update() 실행한다.

              /*  다음은  Observable에서 등록된 Observer들의 Update() 실행시키는 코드이다.

               *  for (int i = arrLocal.length-1; i>=0; i--)

               *      ((Observer)arrLocal[i]).update(this, arg);

               */

              board.addObserver(bob);

              board.addObserver(joe);

              board.addObserver(paul);

              board.addObserver(steven);

              board.changeMessage("More Homework!");

       }

} // end of class MessageBoard

 

 

import java.util.Observable;

import java.util.Observer;

 

class StudentA implements Observer {

      

       /**

        * 연락을 보내는 주제 객체(o)와 주제에서전달된 데이터 객체(arg)가 인자로 전달된다.

        *@see java.util.Observer#update(java.util.Observable, java.lang.Object)

        */

       public void update(Observable o, Object arg) {

              System.out.println("StudentA:Message board changed: " + arg);

       }

}

 

 

import java.util.Observable;

import java.util.Observer;

 

class StudentB implements Observer {

      

       /**

        * 연락을 보내는 주제 객체(o)와 주제에서전달된 데이터 객체(arg)가 인자로 전달된다.

        *@see java.util.Observer#update(java.util.Observable, java.lang.Object)

        */

       public void update(Observable o, Object arg) {

              System.out.println("StudentB:Message board changed: " + arg);

       }

}

 

 

결과 : 

    StudentB:Message board changed: More Homework!

    StudentB:Message board changed: More Homework!

    StudentA:Message board changed: More Homework!

    StudentA:Message board changed: More Homework!

 

 

'Java > Core Utilities' 카테고리의 다른 글

Synchronized and Unsynchronized Collections  (0) 2013.11.04
Navigable Collection  (0) 2013.11.04
Logger  (0) 2013.02.09
Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Posted by Steven J.S Min
,