Observerパターンについて
* Javaには、以下のクラスが事前に用意されている 1) java.util.Observableクラス 2) java.util.Observerインターフェース ※ 使用する場合は、java.util.Observableクラスを継承する必要がある。 そのため、観察対象のクラスが、既に何らかのサブクラスになっている場合、使用できない。
Observableクラス
API仕様書
http://docs.oracle.com/javase/jp/7/api/java/util/Observable.html`メソッド名 | `説明 |
notifyObservers() | 変更をObserverインターフェースを実装したクラスに通知 |
setChanged() | Observable オブジェクトを変更されたものとする |
Observerインターフェース
API仕様書
http://docs.oracle.com/javase/jp/6/api/java/util/Observer.htmlサンプル
Main.java
public class Main { public static void main(String[] args) { System.out.println("Enter Text >"); final EventListener listener = new EventListener(); final EventHandler handler = new EventHandler(); listener.addObserver(handler); Thread thread = new Thread(listener); thread.start(); } }
EventListener.java
Observable クラスを継承import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Observable; public class EventListener extends Observable implements Runnable { @Override public void run() { try { final InputStreamReader inputStreamReader = new InputStreamReader(System.in); final BufferedReader bufferedReader = new BufferedReader(inputStreamReader); while (true) { String userInputValue = bufferedReader.readLine(); this.setChanged(); this.notifyObservers(userInputValue); } } catch (IOException ex) { ex.printStackTrace(); } } }
EventHandler.java
Observer インターフェースを継承import java.util.Observable; import java.util.Observer; public class EventHandler implements Observer { @Override public void update(Observable o, Object arg) { if (arg instanceof String) { System.out.println("\nReceived User Input is " + (String) arg); } } }
出力結果
Enter Text > Hello world, Mike /* <= これは自分で入力する */ Received User Input is Hello world, Mike
参考文献
http://goodjob.boy.jp/chirashinoura/id/135.htmlhttp://en.wikipedia.org/wiki/Observer_pattern
http://www.devx.com/tips/Tip/22592