在我的应用我有三个接口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);
Run Code Online (Sandbox Code Playgroud)
或者我可以使用任何设计模式?我知道责任链模式.我能想象写作课一样CaptureHandler,DecoderHandler和BroadcastHandler继承HandlerBase.HandlerBase将提供将对象移交给下一个处理程序的机制.
var handler1 = new CaptureHandler();
var handler2 = new DecodeHandler();
handler1.SetNext(handler2);
handler1.Handle(object);
Run Code Online (Sandbox Code Playgroud)
但我不知道这是否适合我的情况.
您可以将每个对象的实例放入下一个对象的构造函数中。例如,如果每个解码器实例都需要一个视频捕获实例才能工作,那么您可以有一个构造函数,如下所示......
Decoder(VideoCapture<T> captureDevice)
{
}
Run Code Online (Sandbox Code Playgroud)
对广播器做同样的事情,即有一个构造函数将解码器实例作为参数。
事实上,我什至不确定你是否需要泛型。您可能会这样做,具体取决于您的应用程序。这个问题我们终究只能看到一小部分。不确定您将传递给每个类的类型以及如何在它们内部使用 Type 参数。
但如果我大胆猜测,我认为普通的 OO 层次结构将是最好、最简单的方法。
因此,有一个 Capture 基类,它具有虚拟方法 GetData()。然后,您将为您所做的不同类型的捕获创建子类。“CapturePal”、“CaptureSecam”、“CaptureMeSecam”等。同样,我猜子类对您来说就足够了,而不是通用类型参数(在您的应用程序中 Capture<float>() 也Capture<StringBuilder>()有意义吗?)
因此,一旦您有了用于捕获功能的基类和子类,请对解码器和广播器类执行相同的操作。基类解码器,子类“DivxDecoder”、“MpegDecoder”。基类 Broadcaster 具有子类“TVBroadcaster”、“IPBroadcaster”、“TCPBroadcaster”等。
现在,每个基类的构造函数都会将另一个基类作为参数并调用适当的方法。
这将允许您按如下方式链接它们
var myProcessingChain = new TVBroadcaster(new DivxDecoder (new CaptureSecam(inputData))));
Run Code Online (Sandbox Code Playgroud)
假设所有捕获类采用相同的输入类型。
另一种选择是使用接口。例如,如果您的应用程序有一些类可以同时充当捕获器和解码器。
多思考一下您是否真的需要泛型。当您想要重用算法并且想要对类型不可知,同时强制类型安全时,泛型非常有用。对类型不可知与能够接受一组具有共同点的类型是不同的。在这种情况下,您可以通过使用继承来获得类型之间的共性。