RubyTkでオブザーバ・パターンを勉強したので、メモします。
やりたいこと
- RubyTkで、メインウィンドウからサブウィンドウを起動。
- サブウィンドウから情報(入力フォームに入力された情報など)を取得する。
Ruby初心者の実装
どうやればいいのかわからなかったので、とりあえずクラス変数を使って実装。
依存関係ヌメヌメどろどろの悪い実装。
Ruby中級者の実装
サブウィンドウのオブジェクト生成時に親ウィンドウのオブジェクトのクラスを渡す。
これが普通のやり方かな~。
Ruby知ったかぶりの実装
Ruby, オブジェクト, 通知でググると、observerというライブラリが Ruby標準ライブラリで存在するようだ。
observerとは、ズバリ、Observer Paternをサクッと実装することができるライブラリ。
observerの役割分担
前提として、以下のようにやくわりを持たせる。
- 観察者 : メインウィンドウ
- 被観察者 : サブウィンドウ
observerは被観察者、つまり状態の変化を通知するサブウィンドウで実装される。
observerの使い方
以下の4ステップ。
- add_observerで観察者と被観察者を結びつける。
- 変更があったときにchangedをコール
- notify_observersで観察者に通知
- 観察者側で定義された updateメソッドがコールされる。引数は3で設定した値。
実装例
正直、2つめと3つめの違いがよくわからない。
オブザーバライブラリを使うことで『オレ・こんなことも知ってるっすよ」という いやらしさがある。
Ruby勉強中の実装
追記。
オブザーバパターンは、一つの観察対象に対して、複数の観測者がいるときに威力を発揮する!
ということで、一つのサブウィンドウから、2つのウィンドウにを通知を送るように修正した。