【Flutter/Dart】状態管理 Providerパッケージ
asoacasio
プログラマーの裏舞台
Observerパターンは、観察対象のオブジェクトに変更が発生した場合に、依存する他のオブジェクトに通知を行うデザインパターンです。
株価情報の追跡ツールで効果的に利用できます。株価が一定のしきい値を上回ったり下回ったりした際に通知を送ることができます。
GUIでは、ボタンを押したりテキストに入力したりするユーザ操作がアプリの状態を変化させ、その結果を画面に反映させる必要があります。
Observerパターンはこのような状態の変化とそれに伴う表示の更新の間で連携を取るのに役立ちます。
チャットメッセージの投稿通知を例にして、サンプルコードを書きます。
新しい投稿があった場合にすぐにチャットスクリーンと通知センターに知らせて表示をさせます。
今回の例ではチャットスクリーンと通知センターが観察者です。
チャットメッセージが観察対象になります。
import 'dart:developer';
/// 観察者
abstract class Observer {
void update(String message);
}
/// チャットスクリーン
class ChatScreen implements Observer {
@override
void update(String message) {
log('CHAT: $message');
}
}
/// 通知センター
class NotificationCenter implements Observer {
@override
void update(String message) {
log('NOTIFICATION: $message');
}
}
/// チャットメッセージ
class ChatMessage {
final List<Observer> _observers = [];
/// 観察者を追加する
void addObserver(Observer observer) {
_observers.add(observer);
}
/// 観察者を削除する
void removeObserver(Observer observer) {
_observers.remove(observer);
}
/// 観察者に通知する
void notifyObservers(String message) {
for (var observer in _observers) {
observer.update(message);
}
}
/// メッセージを送信する
void sendMessage(String message) {
notifyObservers(message);
}
}
クライアントコードです。
void main() {
// チャットメッセージを作成します。
ChatMessage chatMessage = ChatMessage();
// チャットスクリーンと通知センターを作成します。
ChatScreen chatScreen = ChatScreen();
NotificationCenter notificationCenter = NotificationCenter();
// チャットメッセージに観察者を追加します。
chatMessage.addObserver(chatScreen);
chatMessage.addObserver(notificationCenter);
// チャットメッセージを送信します。
chatMessage.sendMessage('おはよう!');
// 通知センターへの表示設定をOFFにしたとします。
log('通知センターへの表示設定をOFFにしました。');
// チャットメッセージから観察者を削除します。
chatMessage.removeObserver(notificationCenter);
// チャットメッセージを送信します。
chatMessage.sendMessage('こんにちは!');
}
続いて、ログを見てみます。
[log] CHAT: おはよう!
[log] NOTIFICATION: おはよう!
[log] 通知センターへの表示設定をOFFにしました。
[log] CHAT: こんにちは!
1回目のメッセージ「おはよう!」では、チャットスクリーンと通知センターへ変更情報が伝わっているのが分かります。
2回目のメッセージ「こんにちは!」では、観察者から通知センターを外したのでチャットスクリーンにのみ変更情報が伝わっているのが分かります。
メリットであるオープン・クローズド原則が実現されています。