1

我当前的项目中有多个课程,例如HTMLRequest, SPDYRequest, BHIVERequest. 我从网络流中获取数据,我想知道哪些类可以处理这些数据。为此,我读取了 Stream 数据包的标头(所有协议都采用相同的形式,因此我可以一直阅读,直到得到空行 (\r\n) ),然后将此标头传递给请求类中的静态函数,该函数返回一个布尔值,它告诉它是否是这种请求的标头。现在我希望能够在运行时(从插件)加载特定的协议。能够检查我是否有标题协议的最佳方法是什么。

我的想法是:

  • 一个额外的类Protocol作为单例,然后在 a 中注册RequestFactory,然后必须找出哪个协议可以为这种头创建请求并调用 Protocol.assemble()

  • 一个静态列表,Class<? extends Request>所以我可以通过反射或通过调用静态方法Class.newInstance()

我不喜欢这两种想法,那么在 Java 中动态地做这些事情的正确方法是什么?

4

1 回答 1

2

如果是我,我会做与选项 1 类似但不相同的事情:

  • 在启动时读取所有插件,将它们的标题和对它们的类​​名或实例(如果它们是无状态的)的引用存储HashMap在一个RequestFactory或类似命名的实用程序中。您还将在此映射中存储对内置系统协议的引用。
  • 当请求进来时,调用 以RequestFactory.getProtocol(String header)获取对应该使用的协议的引用。

请注意,如果您走这条路线,则不需要在每个协议类中都有一个方法可以让您查询标头是否适合它;工厂为您处理。

编辑

...我刚刚注意到您问题的“运行时”部分,这使得我的解决方案的“启动时”部分有点不合适。新插件在被识别/加载时仍然可以注册到工厂的内部地图中;这不应该影响整个设计的实用性。

于 2013-11-01T16:14:14.677 回答