java.util.Observableクラス
このクラスは、Observerインターフェースと併用するようにできています。デザインパターンの「Observerパターン」です。
処理の概要
Observableクラスに登録されたObserverクラス(Observerインターフェースをimplementsしたクラス)のupdateメソッドを
変更の通知があったときに呼び出す。
実装してみた
Observableクラスにメインメソッドを実装しました。はじめはObserverクラスに何かしらの変更があったときにupdate処理が走るのかと思ったのですが
次のメソッドが動いたときに走るようです。
Observable#setChanged()とObservable#notifyObservers()を呼び出すとObserverクラスのupdateが起動します。
Observableを継承して作る
import java.util.Observable;
import java.util.function.Function;
public class ObserverSample extends Observable {
/** 引数String, 返却値Stringのメソッド */
private Function<String, String> func;
public ObserverSample(Function fun) {
this.func = fun;
}
public void execute(String str) {
System.out.println(func.apply(str));
}
public static void main(String[] ags) {
// Functionに意味はないです。実装したときの残骸です。。。
ObserverSample sample = new ObserverSample(str -> {
return "aaa: " + str;
});
ChildOverver ovs = new ChildOverver("aaa");
ChildOverver ovs1 = new ChildOverver("bbb");
ChildOverver ovs2 = new ChildOverver("ccc");
sample.addObserver(ovs);
sample.addObserver(ovs1);
sample.addObserver(ovs2);
sample.setChanged();
sample.notifyObservers();
System.out.println("^^^^^^^^^^^^^^^^^^^^");
sample.setChanged();
sample.notifyObservers("pppppp");
}
}
Observerクラス
import java.util.Observable;
import java.util.Observer;
public class ChildOverver implements Observer {
private String str;
public ChildOverver(String str) {
this.str = str;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Param is " + str);
System.out.println("Count: " + o.countObservers());
System.out.println("arg: " + arg);
}
public void setStr(String newStr) {
this.str = newStr;
}
}
プログラムの実行結果
Param is ccc
Count: 3
arg: null
Param is bbb
Count: 3
arg: null
Param is aaa
Count: 3
arg: null
^^^^^^^^^^^^^^^^^^^^
Param is ccc
Count: 3
arg: pppppp
Param is bbb
Count: 3
arg: pppppp
Param is aaa
Count: 3
arg: pppppp