1. パターンの意図
オブザーバ(Observer)パターン は、
あるオブジェクト(Subject)の状態変化を、依存する複数のオブジェクト(Observer)に自動的に通知する デザインパターンです。
解決する問題
- 「状態が変わったら関連する処理を全部更新したい」をシンプルに書きたい
- 複数のオブジェクトに通知する必要があるが、依存関係を強くしたくない
- 1対多の通知を疎結合に実現したい
ポイント
- Subject:観察対象(状態を持つ、Observer を登録/解除、更新を通知)
- Observer:通知を受け取り反応するオブジェクト
- 1対多依存関係:Subject の変更 → Observer 全部に通知
2. UML 図
3. Flutter / Dart 実装例
Observer インターフェース
abstract class Observer {
void update(String state);
}
Subject
class Subject {
final List<Observer> _observers = [];
String _state = "";
void attach(Observer observer) => _observers.add(observer);
void detach(Observer observer) => _observers.remove(observer);
void setState(String state) {
_state = state;
notify();
}
void notify() {
for (var o in _observers) {
o.update(_state);
}
}
}
Observer 実装
class ConcreteObserver implements Observer {
final String name;
ConcreteObserver(this.name);
@override
void update(String state) {
print("$name received update: $state");
}
}
利用例
void main() {
var subject = Subject();
var obs1 = ConcreteObserver("Observer1");
var obs2 = ConcreteObserver("Observer2");
subject.attach(obs1);
subject.attach(obs2);
subject.setState("New State!");
}
出力:
Observer1 received update: New State!
Observer2 received update: New State!
4. Android / Kotlin 実装例
Observer インターフェース
interface Observer {
fun update(state: String)
}
Subject
class Subject {
private val observers = mutableListOf<Observer>()
private var state: String = ""
fun attach(observer: Observer) = observers.add(observer)
fun detach(observer: Observer) = observers.remove(observer)
fun setState(state: String) {
this.state = state
notifyObservers()
}
private fun notifyObservers() {
observers.forEach { it.update(state) }
}
}
Observer 実装
class ConcreteObserver(private val name: String) : Observer {
override fun update(state: String) {
println("$name received update: $state")
}
}
利用例
fun main() {
val subject = Subject()
val obs1 = ConcreteObserver("Observer1")
val obs2 = ConcreteObserver("Observer2")
subject.attach(obs1)
subject.attach(obs2)
subject.setState("New State!")
}
5. 実務ユースケース
Flutter
-
ValueNotifier+ValueListenableBuilder -
Stream+StreamBuilder - Riverpod/Provider での状態変更通知
Android (Kotlin)
- LiveData / Flow / StateFlow による UI 更新
- RecyclerView.Adapter → データ変化通知
- EventBus(GreenRobot, RxJavaなど)
6. メリット / デメリット
メリット
- Subject と Observer の疎結合化
- 1対多通知を簡単に実現
- イベントドリブン設計にマッチ
デメリット
- Observer が増えすぎると追跡が難しい
- 通知のタイミングで意図せぬ更新が起こることもある
まとめ
- Observer パターンは「1対多の通知」を疎結合に実現する仕組み
- Flutter では ValueNotifier/Stream、Android では LiveData/Flow が代表例
- イベントドリブン開発に欠かせない基本パターン