2011-11-11 67 views
5

在我的應用程序中我有三個接口ICapture<T>,IDecoder<T, K>IBroadcaster<K>對象操作鏈接

現在我執行例如VideoCapture類繼承Capture<IntPtr>(IntPtr是類生成的原始數據)。當數據由VideoCapture的對象生成時,首先我想將它從T解碼爲K,然後廣播它。

我想知道的是:你會如何鏈接?簡單地寫一個像

var data = videoCapture.GetData(); 
var decoded = decoder.Decode(data); 
broadcaster.Broadcast(decoded); 

或者有沒有任何設計模式,我可以使用?我知道責任鏈模式。我可以想象寫作類CaptureHandlerDecoderHandlerBroadcastHandler繼承HandlerBaseHandlerBase將提供將對象移交給下一個處理程序的機制。

var handler1 = new CaptureHandler(); 
var handler2 = new DecodeHandler(); 
handler1.SetNext(handler2); 
handler1.Handle(object); 

但我不知道如果這是我的情況最好的方法。

+3

你希望寫什麼比第一版更清晰或更有用?那個對我來說似乎很簡單。 – mquander

+0

如果捕獲,解碼器和廣播公司都是接口,您應該重命名它們以'I'開頭。這是一個標準的.NET命名約定,它會使你的代碼更容易理解和閱讀。 –

+1

不要過時,只是[保持簡單](http://en.wikipedia.org/wiki/KISS_principle)...你的第一個代碼段很好 –

回答

1

你可以將每個對象的一個​​實例放入下一個的構造函數中。如果例如,每解碼器實例需要一個視頻捕獲實例工作,那麼你可以有一個構造函數如下...

Decoder(VideoCapture<T> captureDevice) 
{ 
} 

,做同樣的事情,對於廣播公司,即有一個構造函數,將在一個解碼器實例作爲參數。

事實上,我甚至不確定你會需要泛型。你可能會這樣做,這取決於你的應用。畢竟,我們在這個問題上只能看到一小部分。不知道你將傳遞到每個類中的類型是什麼,以及如何在它們內部使用類型參數。但是,如果我想冒險猜測,我認爲只有正常的面向對象的層次結構纔是最好的,最簡單的方法。

因此,有一個Capture基類,它具有虛擬方法GetData()。然後,您將爲不同類型的捕獲創建子類。 「CapturePal」,「CaptureSecam」,「CaptureMeSecam」等。再次,我猜子類化應該夠你,而不是一個泛型類型參數(會Capture<float>()以及Capture<StringBuilder>()在你的應用程序有意義?)

因此,一旦你有捕獲功能的基類和子類,對Decoder和Broadcaster類也一樣。基類解碼器,子類「DivxDecoder」,「MpegDecoder」。具有「TVBroadcaster」,「IPBroadcaster」,「TCPBroadcaster」等子類的基類Broadcaster。

現在,每個基類的構造函數都會將另一個基類作爲參數並調用適當的方法。

這將允許您按如下

var myProcessingChain = new TVBroadcaster(new DivxDecoder (new CaptureSecam(inputData)))); 

假設所有捕獲類採取同樣的輸入型鏈條他們。

另一種選擇是使用接口。例如,如果您的應用程序有一些類可以充當捕獲器和解碼器。

多想想你是否真的需要泛型。當您想要重用算法並希望對Type不可知時,泛型很有用,同時強制執行類型安全。對Type不可知不同於能夠接受一組具有共同性的類型。在這種情況下,您可以通過使用繼承來獲得類型之間的通用性。

+0

以及關於泛型與OO層次結構 –

+0

將類連接在一起的主要問題是它限制了它們的靈活性。如果您想廣播已經解碼的流,可能已保存到磁盤,該怎麼辦? –

+0

不是。基類仍然爲您提供與接口相同的靈活性。您可以輕鬆實現從「解碼器」繼承的子類,而不是在內存中進行解碼,從磁盤讀取它。廣播類將獲得一個解碼器基類,並在其上調用「GetData」。泛型不會給你更多的靈活性。要麼你將不得不接受任何類型,例如float,StringBuilders,從而限制你可以在方法中做什麼,或者你必須有Type Constraints。所以回到基類或接口。國際奧委會可能會提供幫助,但仍與OO一樣。 – Chaitanya

3

爲什麼你想要避免該方法?這很簡單,我認爲你的應用沒有缺點。

如果GetData =>Decode =>Broadcast模式對其他捕獲很有用,您可以使該方法爲通用。

+1

如果你想把它作爲一個設計模式的標籤,你可以稱之爲KIS模式:) –