对象操作链接

时间:2011-11-11 14:56:09

标签: c# coding-style

在我的应用程序中,我有三个接口ICapture<T>IDecoder<T, K>IBroadcaster<K>

现在我实现了一个继承自VideoCapture的{​​{1}}类(IntPtr是该类生成的原始数据)。当数据由Capture<IntPtr>的对象生成时,我首先想要将其从VideoCapture解码为T,然后广播它。

我想知道的是:你会如何链接这个?只需编写类似

的方法
K

或者我可以使用任何设计模式吗?我知道责任链模式。我可以想象编写继承自var data = videoCapture.GetData(); var decoded = decoder.Decode(data); broadcaster.Broadcast(decoded); 的{​​{1}},CaptureHandlerDecoderHandler等类。 BroadcastHandler将提供将对象移交给下一个处理程序的机制。

HandlerBase

但我不知道这对我的情况来说是最好的方法。

2 个答案:

答案 0 :(得分:3)

为什么要避免这种方法?这很简单,我认为你的应用没有任何不利之处。

如果GetData =&gt; Decode =&gt; Broadcast模式对其他捕获非常有用,您可以使该方法通用。

答案 1 :(得分:1)

您可以将每个对象的实例放入下一个的构造函数中。例如,如果每个解码器实例都需要视频捕获实例才能工作,那么您可以使用如下构造函数...

Decoder(VideoCapture<T> captureDevice)
{
}

为Broadcaster做同样的事情,即有一个构造函数将解码器实例作为参数。

事实上,我甚至不确定你是否需要泛型。您可以这样做,具体取决于您的申请。毕竟我们只能看到这个问题的一小部分。不确定将要传递给每个类的类型以及如何在其中使用Type参数。

但如果我冒险猜测,我认为正常的OO层次结构将是最好,最简单的方法。

所以,有一个Capture基类,它有一个虚方法GetData()。然后,您将为不同类型的捕获创建子类。 “CapturePal”,“CaptureSecam”,“CaptureMeSecam”等。再次,我猜测子类对你来说已经足够了,而不是通用的Type参数( Capture<float>() Capture<StringBuilder>()有意义你的申请?)

因此,一旦为捕获功能提供了基类和子类,就要对Decoder和Broadcaster类执行相同的操作。基类解码器,子类“DivxDecoder”,“MpegDecoder”。基类广播公司,子类为“TVBroadcaster”,“IPBroadcaster”,“TCPBroadcaster”等。

现在,每个基类的构造函数将把另一个基类作为参数并调用适当的方法。

这将允许您按如下方式链接它们

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

假设所有捕获类采用相同的输入类型。

另一种选择是使用接口。例如,如果您的应用程序有一些类可以充当捕获器和解码器。

想一想你是否真的需要Generics。当您想要重用算法并希望与Type无关时,泛型非常有用,同时强制执行Type安全性。与Type无关不同于能够接受一组具有共性的类型。在这种情况下,您可以通过使用继承来获得类型之间的共性。