我想在我的应用程序中加入策略模式。
我在 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 的方法搜索。我怎样才能做到这一点?我是否成功实施了策略模式?
答案 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
这有帮助吗?