由艾倫·馮和阿賈伊·拉克什米納拉亞納勞
重要 ShareThis 產品是社交數據饋送,我們的客戶用於通過互聯網訪問社交信號,並使用有關世界各地生成的社交事件的國家級數據。社交數據饋送是一個包含使用者已查看的每個網頁的事件的檔。此檔每天包含大約5億個事件。事件包含資訊,如 URL、地理和時間戳。最近,一位客戶要求我們根據原產國而不是單個檔將事件放在多個檔中。
我們使用策略模式來解決這個問題。這使我們能夠支援新功能並保留原始功能。策略模式允許對象根據介面後的另一個對象定義其某些行為。我們通過創建兩個新物件來使用策略模式。其中一個方法返回事件的國家/地區。另一種方法始終返回空字串,無論提供什麼事件。
以下是返回該國的策略:
class GroupByCountry:
def doOperation(self, json):
return json[‘geo’][‘ISO’]
下面是始終返回空字串的策略:
class NoGroupBy:
def doOperation(self, json):
return “”
下面的代碼顯示了在創建社交數據饋送的應用程式中如何使用這些策略。此應用程式從 Web 伺服器獲取日誌檔,向每個事件添加資訊,並輸出包含添加資訊的檔。您可以看到代碼第 5 行中使用的策略模式。應用程式將生成多個檔或單個檔,具體取決於哪個策略傳遞到運行方法中。
def run(file, writer, worker, outFilename, strategy):
with open(file) as f:
for line in f:
json = worker.addInfo(f)
country = strategy.doOperation(json)
writer.write(outFilename + ”.” + country, json)
writer.close()
戰略的主要替代是羊羔。Lambdas 比策略更簡潔,但不容易支援添加方法或狀態。我們還希望將每個戰略分離到其自己的模組中,並允許在命令行上指定"戰略"。有了這個要求,lambdas變得像策略一樣詳細,所以我們最終使用了策略。