何か変わったら、通知したいことってありますよね。
メールが来たら、音鳴って欲しいしw
オブザーバー・パターンで、フィールド変数の変更を監視するサンプル
オブザーバー・パターンを使って、フィールド変数の変更を監視します。
フィールド変数が変更されたら、変更後の値を標準出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import java.util.ArrayList; import java.util.List; interface Observer { void update(String value); } public class ObserverTest { private String value = null; private List<Observer> observerList = new ArrayList<Observer>(); public String getValue() { return value; } public void setValue(String value) { this.value = value; //値の変更をオブザーバーに通知 notifyObserver(); } public void addObserver(Observer observer) { observerList.add(observer); } public void removeObserver(Observer observer) { observerList.remove(observer); } private void notifyObserver() { for(Observer o : observerList) { o.update(value); } } public static void main(String[] args) { //newして、オブザーバーをセット ObserverTest obj = new ObserverTest(); obj.addObserver(System.out::println); //値を変えてみる obj.setValue("a"); obj.setValue("b"); } } |
実行結果
変更されたフィールド変数の値が出力されます。
1 2 | a b |
サンプルの解説
Javaでは、オブザーバーはリスナーと言った方が馴染みがあるかもしれません。
ここでは、オブザーバー・パターンなんで、インターフェース名はあえてObserverにしています。
仕組みは簡単で、オブザーバーを対象のクラスにセット。
フィールド変数が変わったら、Observer#update(String)をコールバックすることで、フィールド変数の監視ができます。
また、今回作ったObserverインターフェースは、Stringだけの引数を持ったメソッド1つで関数型インターフェースなんで、めんどいのでメソッド参照で標準出力しています。
これだけだったら、setValue(String)に、System.out.println(String)を書いてしまえば、本当は済んでしまう話ではあるんですが、、、
このパターンを使うメリットは、このクラスを使う人が自由に監視する内容を決められることにあります。
つまり、このクラス自体を改変する必要がないってことですね。
今回は自作しましたが、フィールド変数の監視はPropertyChangeListenerとPropertyChangeSupportを使うと、簡単に実装することができます。