在我的应用程序中,我有三个接口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}},CaptureHandler
和DecoderHandler
等类。 BroadcastHandler
将提供将对象移交给下一个处理程序的机制。
HandlerBase
但我不知道这对我的情况来说是最好的方法。
答案 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无关不同于能够接受一组具有共性的类型。在这种情况下,您可以通过使用继承来获得类型之间的共性。