2

アプリケーションに戦略パターンを組み込みたい。

次のクラスをlibの下に保存しました。

class Network
  def search
    raise "NO"
  end

  def w_read
    raise "NO"
  end
  #...
end

class FacebookClass < Network
  def search
    # FacebookClass specific...
  end

  def w_read
    raise OneError.new("...")
  end
end

class TwitterClass < Network
  def search
    # TwitterClass specific...
  end

  def w_read
    # TwitterClass specific...
  end

  def write
    # TwitterClass specific...
  end
end

app/model/ network_searcher.rbからTwitterClassのメソッドsearchを呼び出します。どうやってやるの?ここで戦略パターンをうまく実装できましたか?

4

2 に答える 2

6

ウィキペディアの例では、あなたapp/model/network_searcherはこのようなものであるべきだと思います

class NetworkSearcher
  def initialize(search_class)
    @search_class = search_class
  end

  def search_social
    @search_class.search
  end

  def w_read_social
    @search_class.w_read
  end

  def write_social
    @search_class.write
  end
end

次に、コントローラーまたはそれを呼び出したい場所で、次のように呼び出すことができます。

search_class = TwitterClass.new # or FacebookClass.new
network_searcher = NetworkSearch.new(search_class)
network_searcher.search_social # or network_searcher.w_read_social or network_searcher.write_social

また、これらのクラスを lib に保持している場合、Rails 3 では、これらのクラスを自動ロードするために、この行をconfig/application.rb

config.autoload_paths += %W(#{config.root}/lib)

また、Rails のファイル名の命名規則に従います (たとえば、TwitterClassという名前にする必要がありますtwitter_class.rb)。それ以外の場合は、これらのクラスを使用している場合は常にこれらのファイルを必要とする必要があります。

于 2012-09-23T11:26:12.910 に答える
0

戦略パターンは、使用するアルゴリズムを実行時に選択できるようにするために使用されます。詳細がなければ、これがあなたの問題に適しているかどうかはわかりません。それが必要であると仮定すると、モデルに検索を設定する方法があり、選択したアルゴリズムをモデルの他の場所で使用できます。例えば

class TheInformation
  attr_writer :searcher

  def other_method
    ..
    # can use the selected searcher here
    @searcher.search
    ..
  end
end

それは役に立ちますか?

于 2012-09-20T11:35:34.520 に答える