2012-09-20 40 views
2

我想在我的應用程序中包含策略模式關於策略模式和Rails

我已經存儲在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 

現在我想調用的方法搜索TwitterClass應用程序/模型/ network_searcher.rb的。我怎樣才能做到這一點?我在這裏成功實施了策略模式嗎?

+0

這些類代表什麼? –

+0

我想要有一個通用類來定義搜索,然後是兩個子類,它們特別定義了Twitter搜索和Facebook搜索,所以我總是可以選擇其中的一個。 – nadine1988

+0

我在這裏聞到Java。 也許你不需要FinalInformation基類(它看起來像一個Java接口/抽象類)。 在ruby中,具有相同方法簽名的兩個類具有共同的「接口」就足夠了。但這取決於你想要做什麼,而且你沒有給我們提供很多信息。 – cthulhu

回答

0

strategy pattern用於允許在運行時選擇算法。沒有更多細節,很難說這是否適合您的問題。假設它是那麼你需要的是一種在你的模型上設置搜索的方法,然後你可以在你的模型的其他地方使用選定的算法。例如

class TheInformation 
    attr_writer :searcher 

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

這有幫助嗎?

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)。否則,無論使用這些類,您都必須要求這些文件。

+0

我在這裏發現一些不好的命名。 'search_class'應該是'searcher'。你在'NetworkSearch'中並沒有真正傳遞一個類常量,你傳遞了一個類的實例。 –