对象操作链
本文关键字:操作 对象 | 更新日期: 2023-09-27 18:14:31
在我的应用程序中,我有三个接口ICapture<T>
, IDecoder<T, K>
和IBroadcaster<K>
。
现在我实现了一个继承Capture<IntPtr>
的VideoCapture
类(IntPtr是该类产生的原始数据)。当VideoCapture
的对象产生数据时,我首先想将其从T
解码到K
,然后广播。
我想知道的是:你怎么把它链起来?只需编写一个像
这样的方法var data = videoCapture.GetData();
var decoded = decoder.Decode(data);
broadcaster.Broadcast(decoded);
或者有什么设计模式,我可以使用?我知道责任链模式。我可以想象从HandlerBase
继承CaptureHandler
、DecoderHandler
和BroadcastHandler
这样的类。HandlerBase
将提供将对象移交给下一个处理程序的机制。
var handler1 = new CaptureHandler();
var handler2 = new DecodeHandler();
handler1.SetNext(handler2);
handler1.Handle(object);
但我不知道这是否是我的情况下最好的方法。
为什么要避免使用这个方法?这很简单,我看不出你的应用程序有什么缺点。
如果GetData
=> Decode
=> Broadcast
模式对其他捕获有用,则可以使该方法具有通用性。
可以将每个对象的实例放入下一个对象的构造函数中。例如,如果每个解码器实例都需要一个视频捕获实例才能工作,那么您可以使用如下构造函数…
Decoder(VideoCapture<T> captureDevice)
{
}
并对广播器做同样的事情,即有一个构造函数将接受一个解码器实例作为参数。
事实上,我甚至不确定你是否需要泛型。您可能需要,这取决于您的应用程序。毕竟,我们只能看到这个问题的一小部分。也不确定要向每个类传递什么类型,以及Type形参将如何在其中使用。
但是如果我要冒险猜测,我认为正常的OO层次结构将是最好的,最简单的方法。
所以,有一个Capture基类,它有一个虚拟方法GetData()。然后,您将为您所做的不同类型的捕获创建子类。"CapturePal"、"CaptureSecam"、"captureesecam"等。再一次,我猜子类化对你来说就足够了,而不是一个泛型类型参数( Capture<float>()
和Capture<StringBuilder>()
在你的应用程序中有意义吗?)
因此,一旦你有了捕获功能的基类和子类,对你的Decoder和broadcast类做同样的事情。基类Decoder,子类DivxDecoder, MpegDecoder。基类broadcast带有子类" tvbroadcast ", " ipbroadcast ", " tcpbroadcast "等
现在,每个基类的构造函数将接受另一个基类作为参数,并调用相应的方法。
这将允许您将它们链接如下
var myProcessingChain = new TVBroadcaster(new DivxDecoder (new CaptureSecam(inputData))));
假设所有捕获类采用相同的输入类型。
另一个选择是使用接口。如果您的应用程序有一些类可以同时充当捕获器和解码器,例如。
考虑一下你是否真的需要泛型。当您希望重用算法并希望在强制类型安全的同时对类型不可知时,泛型很有帮助。对类型不可知不同于能够接受一组共享共性的类型。在这种情况下,您可以通过使用继承来获得类型之间的共性。