4

我與需要接收好幾部影片,在特定網頁上顯示它們的應用程序的工作,目前這些視頻也只能是來自YouTube,由於不允許其他供應商的實現,因爲代碼來獲取視頻數據作爲預覽圖像直接放置在負責顯示視頻的View Helper中。這是一個很好的策略模式用例嗎?

我想改變這個結構以便於添加新的提供者,比如Vimeo,並且我認爲策略模式會是理想的,我會在我的View Helper中使用方法setVideoUrl(string $url),這個方法會調用方法getProviderStrategy(string $url)class VideoProviderFactory,這個工廠類會再返回,如果有的話,戰略類,實現了interface VideoProvider,對於視頻網址的提供者。

您認爲如何?這是對的?我需要改變一些東西?

細節:我最初考慮將切換選擇策略直接進入View Helper,但在看完這個問題後:I Strategy Pattern with no 'switch' statements?我看到我錯了,於是class VideoProviderFactory出現了。

回答

5

這看起來像一個非常好的設計,有責任的適當分離。

爲了給你一些更多的思考,考慮如何工廠將決定創建哪個策略。稍後當您想要添加另一個策略時,需要更改哪些內容?首先,你需要創建一個新的VideoProvider,那麼你就必須改變出廠switch語句(如你所述),幷包括對這個新戰略的選擇邏輯。現在,這在大多數情況下都是完美的,但如果您想在不改變工廠的情況下添加新策略呢?

的方法之一是具有與決定基於URL是否應該創建一個特定VideoProvider的方法的工廠一樣的界面;讓我們把它VideoProviderMatcher(僞代碼):現在

interface VideoProviderMatcher { 
    bool understands(url) 
    VideoProvider create() 
} 

,該接口知道它是否能夠理解的URL以及如何創建,涉及到它的VideoProvider。當您需要創建新戰略時,您需要執行VideoProvider和相關VideoProviderMatcher。至於工廠,它改變封裝的VideoProviderMatcher S和代表名單,以能理解給定URL的第一,使用鏈責任(僞代碼):

class VideoProviderFactory { 
    List[VideoProviderMatcher] matchers 
    void registerMatcher(VideoProviderMatcher matcher) { 
    matchers.add(matcher) 
    } 
    VideoProvider getVideoProviderFor(url) { 
    foreach (matcher in matchers) { 
     if (matcher.understands(url)) return matcher.create() 
    } 
    } 
} 

現在唯一代碼需要改變的是首先創建工廠的代碼。理想情況下,它有一個VideoProviderMatcher的列表,它用於填充工廠,並且您只需將另一項添加到列表中。

現在,這值得嗎?我認爲這取決於匹配邏輯的複雜性,將視頻提供者與URL匹配封裝在一起的意願,在添加新策略時保持工廠穩定的願望,以及添加新策略的速度解決方案。

+0

好的。我唯一不明白的是爲什麼我們需要中間VideoProviderMatcher接口。無法將該功能作爲VideoProvider類的一部分來實現嗎? – hennes 2012-04-16 05:55:42

+0

@hennes國際海事組織,VideoProviderMatcher使URL的理解更加抽象。然後,匹配器可以接受實現,以基本上過濾出各種條件下的URL,例如url/url的一部分。 – Nrj 2012-04-16 06:22:27

+0

好的,這是一個很好的觀點。感謝澄清。 – hennes 2012-04-16 06:39:21

相關問題