Rubyのデザインパターン開発におけるobserverパターンの一例
一般に、Observerパターンの定義は、「あるオブジェクトが変更されたというニュースの発信源と、そのニュースの消費者の間に、きれいなインタフェースを構築すること」のようなものだろう。
Observerパターンは、メッセージのproducerとconsumerの間の結合が抽象化されるように、きれいなインタフェースを確立します。observed は observer のどちらかを知ることはできませんが、両者が共通のインタフェースを実装していることだけは知っています。observerとobservedは緊密に結合していないので、異なる抽象レベルに属することができる。
observerパターンはブロードキャスト通信をサポートしており、observedは登録された各observerにブロードキャストで変更メッセージを送信します。このブロードキャストパターンは、オブザーバがループして通知される可能性があり、多くのリソースを消費してしまいます。
一般化したObserverパターンでは、定義すべき役割が2つある。
件名: メッセージを生成するクラスが件名です。前の例では、それはTesterクラスでした。
オブザーバー。subjectが生成したメッセージに興味を持つクラス。前の例では、税務署と社会保険労務士クラスがこれにあたります。
主語と観察者の関係を男女で例えるなら、主語は観察者で、男の子が片思いしている女の子のようなものです。少年は少女に夢中になっているが、少女はいつもぎりぎりのところで、覆い隠している。そこで、少年は少女に言った。僕は君を待つよ、もし家があるなら知らせてほしい、そうでなければ僕は待っていたよ。ここで少年は少女の観察者であり、少女が生み出すニュース、つまり帰郷があるかどうかに関心を持つ。だから、少女は帰宅メッセージが発生すると少年に通知し、ラブカップが誕生するわけですが、完全な観察者モデルが完全に実現されています。
SUBJECTとして、実装すべきインターフェースは以下の通りです。
- オブザーバーの追加
- オブザーバーを削除する
- オブザーバを通知する
また、オブザーバーとして、通知を受け取る際の特定の動作を実装する必要があります。
例
rubyにはobserverというクラスがあり、それを使ってobserverパターンを実装することができます。
コード例です。
# -*- coding: GB2312 -*-
require 'observer'
# Example of using the observer pattern (ruby)
# Observed P
class PObservable
include Observable
end
# Observer A
class AObserver
# update method name is required to have
def update(arg)
puts "AObserver was notified " + arg
end
end
# Observer B
class BObserver
# update method name is required to have
def update(arg)
puts "BObserver was notified " + arg
end
end
# Observer initialization
observer_a = AObserver.new
observer_b = BObserver.new
# Observed observer initialization
obj = PObservable.new
# Add the observer object
obj.add_observer(observer_a)
obj.add_observer(observer_b)
# Observed changed -> this code must be there otherwise the observer cannot be notified
obj.changed
# Notify the observer
obj.notify_observers("Test")
出力結果です。
AObserver was notified of Test
BObserver was notified of the Test
関連
-
redisクラスタ構築のチュートリアルと発生した問題
-
バブルソートアルゴリズムの簡易実装とRuby版
-
GitHubが提唱するRubyコードの書き方まとめ
-
RubyのProcクラスとProc.newメソッドの使用法
-
Ruby は REXML ライブラリを使って xml 形式のデータをパースする
-
デザインパターンのうち、ProxyパターンとDecorativeパターンを使ったRubyのコード例
-
RubyプログラムにおけるXMLファイルの作成と解析のための方法
-
Ruby on Railsのパフォーマンスを最適化するためのいくつかの方法についての考察
-
Ruby on Railsのルーティング設定に関するいくつかのアドバイス
-
Rubyプログラミングにおけるネーミングスタイルガイド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
画像フィルターアルゴリズムコードのRuby実装
-
Rubyを使ったラムダ計算の詳しいシミュレーション方法
-
win10でvirtualbox+vagrantでrubyの開発マシン環境を構築する
-
Rubyのオブジェクト指向プログラミングにおけるスコープの簡単な説明
-
Rubyのgemパッケージマネージャの使い方とbundlerによる複数バージョンのgemの管理
-
Rubyの4つの比較関数(equal?, eql?, ==, ===)について解説します。
-
Rubyでコレクションを書くためのガイド
-
Ruby on RailsでMarkdownを使用する方法
-
Ruby WebDriverガイド
-
Rubyでの正規表現の使い方基本ガイド