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 回答