Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 用于将对象与句柄匹配的软件模式_Java_Design Patterns_Architecture - Fatal编程技术网

Java 用于将对象与句柄匹配的软件模式

Java 用于将对象与句柄匹配的软件模式,java,design-patterns,architecture,Java,Design Patterns,Architecture,我一直在思考解决这个问题的方法,但我没有找到任何能说服我的解决方案。我正在编写一个爬虫程序,我有一个从url列表下载每个url的任务。此外,根据站点url和我想要获取的信息,以不同的模式解析不同的html文档。因此,我的问题是如何将每个任务与其相应的解析链接起来 这些想法是: 创建一个巨大的“如果”,检查下载类型并关联解析。 (避免,因为“如果”随着每个新的不同站点添加到爬虫程序中而不断增长) 使用多态性,为每个不同的站点创建不同的下载任务,并与我想要获取的信息类型相关,然后使用post操作链接

我一直在思考解决这个问题的方法,但我没有找到任何能说服我的解决方案。我正在编写一个爬虫程序,我有一个从url列表下载每个url的任务。此外,根据站点url和我想要获取的信息,以不同的模式解析不同的html文档。因此,我的问题是如何将每个任务与其相应的解析链接起来

这些想法是:

  • 创建一个巨大的“如果”,检查下载类型并关联解析。 (避免,因为“如果”随着每个新的不同站点添加到爬虫程序中而不断增长)

  • 使用多态性,为每个不同的站点创建不同的下载任务,并与我想要获取的信息类型相关,然后使用post操作链接其解析。 (使用每一个新的解析器都会再次增加复杂性)

  • 因此,我正在寻找某种软件模式或想法,例如:

    • 嘿,我是一个下载任务与此信息

    • 真的吗?然后您需要这个解析来提取它。这是您需要的解析

    其他信息:

    架构非常简单。包含作为爬虫种子的URL的列表。下载网页的制作人。下载html文档的其他列表。消费者应该为页面应用正确的解析

    根据页面下载情况,有时我们需要使用解析a或解析B等

    编辑

    例如:

    我们有三个网站:site1.com、site2.com和site3.com

    我们需要解析三种URL类型:site1.com/A、site1.com/B、site1.com/C、site2.com/A、site2.com/B、site2.com/C。。。site3.com/C

    它解析的每个url在site1.com/A-site2.com/A-site3.com/A;之间是不同的,通常是相同的信息;site1.com/C-site2.com/C-site3.com/C

    看起来是一个符合您对问题描述的可行解决方案,您首先需要找到的是基本(原子)解决方案

    以下是维基百科的一个小描述:

    在遗传算法中,一个优化问题的候选解(称为个体、生物或表型)群体朝着更好的解进化。每个候选溶液都有一组可以变异和改变的属性(染色体或基因型);传统上,解决方案用二进制表示为0和1的字符串,但也可以使用其他编码方式。[2]

    进化通常从随机生成的个体群体开始,是一个迭代过程,每次迭代中的群体称为一代。在每一代中,评估群体中每个个体的适应性;适应度通常是要解决的优化问题中目标函数的值。从当前群体中随机选择更合适的个体,并对每个个体的基因组进行修改(重组并可能随机突变)以形成新一代。然后在算法的下一次迭代中使用新一代候选解。通常,当生成的代数达到最大值或种群达到令人满意的适应度水平时,该算法终止

    典型的遗传算法需要:

    解决方案域的遗传表示, 用于评估解决方案域的适应度函数。 每个候选解决方案的标准表示形式为位数组。[2]其他类型和结构的数组基本上可以以相同的方式使用。使这些遗传表示更方便的主要特性是,由于它们的固定大小,它们的部分很容易对齐,这有利于简单的交叉操作。也可以使用可变长度表示,但在这种情况下,交叉实现更加复杂。在遗传规划中探索树状表示,在进化规划中探索图形形式表示;在基因表达式编程中探索了线性染色体和树的混合


    一旦定义了遗传表示和适应度函数,遗传算法就开始初始化一组解,然后通过重复应用变异、交叉、反转和选择算子来改进它。

    我会以某种形式(如XML)将解析模式/结构外部化并动态地使用它们

    例如,我必须下载site1.com和site2.com。两者都有两种不同的布局。我将创建两个保存布局模式的xml

    还有一个主xml,它可以保存哪个url应该使用哪个xml

    启动时,加载此主xml并将其用作字典。当您必须下载时,下载页面并从字典中找到xml,然后将字典和流传递给解析器(单个通用解析器),解析器可以根据xml流和xml信息读取流

    通过这种方式,我们可以在xml中创建通用模式,并使用它来读取类似的站点。使用xml模式中的正则表达式以单个xml覆盖大多数站点

    如果布局完全不同,只需创建一个xml并修改主xml即可


    这种设计的秘诀/成功之处在于如何创建这样的通用XML,这完全取决于您需要什么以及解析后要做什么。

    这似乎是一个连接问题。我建议考虑快速查找算法

    请参阅此处了解更多详细信息。

    这是一个简单的java示例,

    我喜欢遗传算法的想法,因为它涉及到每次迭代都要改进。然而,我不能设置一个函数来评估解决方案域,因为我不知道一个“解析良好”的站点会产生什么结果。例如,在site1.com中,我有一个包含10个项目的列表,而在site2.com中,我有一个包含相同信息但不包含wi的列表