使用可插拔组件的应用程序的OO设计问题

时间:2015-02-25 13:38:33

标签: java oop design-patterns architecture

我试图重构一个丑陋的代码并使其在未来很容易扩展。

应用程序应该只是一系列具有输入和输出的组件。组件以这样的方式链接,即当前组件的输入是一个(或多个)先前组件的输出。

这里简要介绍了我到目前为止所拥有的内容:

  1. Reader

    • 表示数据源
    • 可以是HDD,在线资源,数据库等文件。
  2. Splitter

    • 输入为Reader(s)
    • 将阅读器提供的内容拆分为部分
    • 输出是Reader(s)
    • 的拆分内容
  3. Model

    • 输入为Splitter(s)
    • 根据Splitter(s)输出
    • 创建某个模型
    • 输出是静音的,但您可以说输出是可以查询单个输入的内部状态
  4. Tester

    • 输入是模型
    • 它可以在模型中查询某些数据的结果
    • 输出是可选的,但如果使用它,它是(queryInput,queryOutput)数据流
  5. Writer

    • 输入是实际产生对象集合的任何东西
    • 将该集合写入任何地方
    • 我不知道现在的输出是什么
  6. 所以,我希望能够以下列方式插入它们:

    -->Reader-->Splitter-->Model-->Tester-->Writer-->

    然而,这也是一个有效的组合(它显然只做一个简单的数据传输)

    -->Reader-->Writer-->

    现在,由于我希望能够将所有内容(几乎)插入所有内容并且(可能)创建相当长的链,我假设我必须拥有某种{ {1}}界面。

    另外,在创建这样一个大链时,我可能想把它包裹在Pluggable之后。由于我希望每个可插入组件(类)都被其他组件替换,因此可以想到Facade模式。

    现在,既然我已经在这里提到过术语链,我会想到Strategy模式,以下(或类似的方式):

    Chain of Responsibility

    例如,如果我想让public interface Pluggable<InputType, OutputType> { public void consume(Pluggable<?, InputType> previous); public Collection<OutputType> produce(); } 拆分由Splitter提供的File列表,则可能如下所示:

    Reader

    最后,组件可能如下所示:

    public class Splitter<InputType, OutputType> implements Pluggable<?, InputType> { public void consume(Pluggable<?, InputType> previous) { // retrieves for example a list of InputType objects } public Collection<OutputType> produce() { // filters the collection it got and returns a sublist for example } }

    我不知道如何描述我遇到的问题,但我确信这样的事情是可以实现的。对于可视化示例,这里是RapidMiner进程的图像

    RapidMinerChainExample

    请注意,我没有尝试复制或复制Rapid Miner,只是我分配的项目看起来可以以类似的方式实现。

    我很感激有关如何设计此类应用的任何帮助。

1 个答案:

答案 0 :(得分:1)

听起来我觉得这是一个结构性问题,而不仅仅是一个行为问题。因此,我想到了几种模式。

复合图案。它以树状方式组织对象。我会说,你在那里有什么。子项与其父项相关联,如果接口正确,则可以在父对象上调用&#34; doWork()&#34; -method并遍历叶子。

想到的模式二是装饰者。您可以创建一个表示数据的类,并在每个步骤中对其进行装饰。

我会选择第一个替代方案来说实话。

当然,您可以将这些模式与其他模式(如访问者或迭代器等等)结合起来,但在我看来这将是未来的事情:)