0

我有一个小设计问题,希望得到一些建议:

我有几个继承自同一个基类的类,每个类都可以接受相同的数据并以稍微不同的方式对其进行分析。

Analyzer
     |
     ˪_ AnalyzerA
     |
     ˪_ AnalyzerB
     ...

我有一个输入文件(我无法控制文件的格式),它定义了应该调用哪些分析器及其参数。另外,它以相同的方式定义数据提取器和其他类似的东西(类似的意思是这是一个可以有多种变化的动作)。

我有一个模块可以遍历文件中的不同分析器并调用一些构造正确分析器的工厂。对于输入文件可以定义的每个原型,我都有一个工厂,到目前为止一切都很好。

但是如果我想扩展它并添加一种新型分析器怎么办?

我正在考虑的解决方案是为每个工厂使用一个属性文件,该文件将以工厂名称命名,并且它将保存输入文件的定义之间的映射,即它希望我执行的任何内容与我用来执行的实际类行动。

这样我可以在运行时加载该类->验证它是否实现了正确的接口,然后执行它。

如果某个 John Doe 想创建自己的分析器,他只需要在正确的文件中添加一个新属性(我不太确定允许这种属性定制的最佳策略是什么)。

简而言之:

  1. 我的解决方案是否存在缺陷?
  2. 如果没有,允许自定义属性的最用户友好/方便的方式是什么?

附言

  1. 不幸的是,我仅限于使用内置的 JDK 类作为现有解决方案,所以我不能只在它们上添加 SF。
  2. 我希望这个问题并不过分我只是不习惯以这种方式剪掉我的翅膀,没有 SF 或其他东西来帮助我实施一个优雅的解决方案。
4

1 回答 1

0

看看java.sql.DriverManager.getConnection(connectionString)方法是如何实现的。最好的方法是观看源代码。

这个想法的非常粗略的总结(它隐藏在很多私有方法中)。它或多或少是一种责任链的实现,尽管没有驱动程序的链表。

  1. DriverManager 管理驱动程序列表。
  2. 每个驱动程序必须通过调用它的方法 registerDriver() 将自己注册到 DriverManager。
  3. 在请求连接时,getConnection(connectionString) 方法会依次调用驱动程序并传递连接字符串。
  4. 每个驱动程序都知道给定的连接字符串是否在其权限范围内。如果是,它会创建连接并返回它。否则,控制权将传递给下一个驱动程序。

比喻:

  • 驱动程序 = 你的具体分析器
  • 连接字符串 = 要分析的文件类型

优点:

  1. 无需将分析器与它们所要使用的文件类型显式绑定。让分析器自行决定是否能够分析文件。如果不是,则返回 null(或异常或其他)以告诉 AnalyzerManager 应该询问该行中的下一个分析器。
  2. 添加新的分析器只是意味着向 register() 方法添加一个新的调用。完全解耦。
于 2013-11-17T16:13:43.673 回答