Index
観察対象の状態が変化したことが、観察者に通知されます。
Observerパターンは状態変化に応じた処理を記述するときに有効です。
- 交換可能性がある
- 状態変化に応じた処理を記述するときに有効である
数を生成するオブジェクトを観察社が観察して、その値を表示するサンプルコードを見ていきましょう。
クラス図はこんな感じ
観察者を表現するインターフェースです。
1 2 3 |
public interface Observer { public abstract void update(NumberGenerator generator); } |
数を生成する抽象クラスです。
実際の数を生成、取得する部分はサブクラスが実装することを期待しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.ArrayList; import java.util.List; public abstract class NumberGenerator { private List<Observer> m_observers = new ArrayList<>(); public void addObserver(final Observer observer) { m_observers.add(observer); } //通知する public void notifyObservers() { m_observers.stream().forEach(o -> o.update(this)); } //数を取得する public abstract int getNumber(); //数を生成する public abstract void execute(); } |
乱数を使って整数を作成し、notifyObserversを使って観察者に通知します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.Random; public class RandomNumberGenerator extends NumberGenerator { private int m_number = 0; private final Random m_random = new Random(); @Override public int getNumber() { return m_number; } @Override public void execute() { m_number = m_random.nextInt(20); notifyObservers(); } } |
観察した数を「数字」で出力するクラスです。
1 2 3 4 5 6 7 8 9 |
public class DigitObserver implements Observer{ @Override public void update(NumberGenerator generator) { System.out.println("DigitObserver" + generator.getNumber()); } } |
観察された数を記号で出力するクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class GraphObserver implements Observer{ @Override public void update(NumberGenerator generater) { System.out.println("Graph Observer:"); final int count = generater.getNumber(); for(int i = 0 ; i < count ; i++) { System.out.print("@"); } System.out.println(""); } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Main { public static void main(String[] args) { final NumberGenerator generator = new RandomNumberGenerator(); final Observer observer = new DigitObserver(); final Observer observer2 = new GraphObserver(); generator.addObserver(observer); generator.addObserver(observer2); generator.execute(); } } |
1 2 3 |
DigitObserver18 Graph Observer: @@@@@@@@@@@@@@@@@@ |