【デザインパターン】【GoF】【Java】Observerパターン ~Observableクラス / Observerインターフェース ~

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.html
http://en.wikipedia.org/wiki/Observer_pattern
http://www.devx.com/tips/Tip/22592