关于策略模式和Rails

时间:2012-09-20 08:04:15

标签: ruby-on-rails ruby strategy-pattern

我想在我的应用程序中加入策略模式

我在 lib 下存储了以下类。

class Network
  def search
    raise "NO"
  end

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

AND

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 的方法搜索。我怎样才能做到这一点?我是否成功实施了策略模式

2 个答案:

答案 0 :(得分:6)

按照Wikipedia中的示例,我认为您的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)。否则,无论您在何处使用这些类,都必须要求这些文件。

答案 1 :(得分:0)

strategy pattern用于允许在运行时选择算法。没有更多细节,很难说这是否适合您的问题。假设您需要的是一种在模型上设置搜索的方法,然后您可以在模型的其他位置使用所选算法。 e.g。

class TheInformation
  attr_writer :searcher

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

这有帮助吗?