1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【デザインパターン】オブザーバパターン解説(Flutter / Android 実例付き)

Last updated at Posted at 2025-09-02

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 が代表例
  • イベントドリブン開発に欠かせない基本パターン

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?