Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有可插拔组件的应用程序的OO设计问题_Java_Oop_Design Patterns_Architecture - Fatal编程技术网

Java 具有可插拔组件的应用程序的OO设计问题

Java 具有可插拔组件的应用程序的OO设计问题,java,oop,design-patterns,architecture,Java,Oop,Design Patterns,Architecture,我正试图重构一个丑陋的代码,并使其在将来易于扩展 应用程序应该是一系列具有输入和输出的组件。组件的链接方式使当前组件的输入是一个(或多个)先前组件的输出 以下是我到目前为止的简要概述: 读卡器 表示数据源 可以是硬盘上的文件、在线资源、数据库等 拆分器 输入是读卡器 将reader提供的内容拆分为多个部分 输出是读卡器的拆分内容 型号 输入是拆分器 基于拆分器输出创建某物的模型 输出是静默的,但您可以说输出是一个内部状态,可以查询单个输入 测试仪 输入是一个模型 它可以查询模型以获

我正试图重构一个丑陋的代码,并使其在将来易于扩展

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

以下是我到目前为止的简要概述:

  • 读卡器

    • 表示数据源
    • 可以是硬盘上的文件、在线资源、数据库等
  • 拆分器

    • 输入是
      读卡器
    • 将reader提供的内容拆分为多个部分
    • 输出是
      读卡器的拆分内容
  • 型号

    • 输入是拆分器
    • 基于
      拆分器
      输出创建某物的模型
    • 输出是静默的,但您可以说输出是一个内部状态,可以查询单个输入
  • 测试仪

    • 输入是一个模型
    • 它可以查询模型以获得某些数据的结果
    • 输出是可选的,但如果使用它,它是(queryInput,queryOutput)数据流
  • Writer

    • 输入实际上是产生对象集合的任何东西
    • 将该集合写入任何位置
    • 我不知道现在的输出应该是什么
  • 因此,我希望能够通过以下方式插入它们:

    -->读卡器-->拆分器-->型号-->测试仪-->写卡器-->

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

    -->读卡器-->写卡器-->

    现在,由于我希望能够(几乎)将所有内容都插入到所有内容,并(可能)创建相当长的链,因此我假设我必须拥有某种
    可插入的
    接口

    此外,在创建如此大的链时,我可能希望将其包装在
    门面
    后面。由于我希望每个可插拔组件(类)都被其他组件替换,所以我想到了
    策略
    模式

    现在,由于我已经在这里提到了“链”这个术语,我想到了责任链模式,如下(或类似方式):

    最后,组件可能看起来像这样:

    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进程的图像

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


    如果您能为我设计这样的应用程序提供帮助,我将不胜感激。

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

    复合模式。它以树状方式组织对象。我想说的和你的差不多。子对象链接到其父对象,如果接口正确,只需在父对象上调用“doWork()”-方法并遍历到叶子

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

    老实说,我会选择第一种选择


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

    一个很好的旧发布/订阅模式,但我真的不确定。。。你可能会在Hmz上更幸运,是的,我没有那样想。这绝对是另一个选择:实际上,对我来说最有希望的是观察者和装饰者。然而,我不确定当一个组件有多个输入和输出时,decorator将如何表示这种情况。然而,有效的评论是:D
    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
        }
    }