用于评分/排名专辑的Java模式

时间:2017-11-01 17:35:50

标签: java algorithm design-patterns

我正在构建一个相对简单的算法,根据几个标准对专辑进行评分 - 例如,收听计数,音频质量,星级评论,专辑插图的存在等等。我正在尝试确定最佳设计模式这个算法会是,我会喜欢输入。现在,我觉得Builder最能解决这个问题。

以下是一些更多细节:

  1. 根据使用Scorer的服务,最终用户可以选择要包含或排除的条件。例如,一项服务可能希望考虑星级评论,而其他服务可能不希望根据星级评论进行评分。最终,用户应该根据自己的需要建立自己的得分手。
  2. 条件的输入范围从int到String到boolean和其他类型。
  3. 每张专辑都会计算得分。其他专辑不会影响专辑的分数。
  4. 必须包含一些基线标准。例如,至少,得分手必须使用收听计数和音频质量。如第一点所述,除了这些最低标准之外,用户还可以包括其他标准。
  5. 该算法的输入是一张专辑及其附带的数据:[专辑,听力计数,音频质量,明星评论等...]
  6. Builder模式似乎最适用于此,因为它允许用户构建自己的算法,同时避免伸缩。思考?是否还有其他模式,我应该考虑使用Builder?

2 个答案:

答案 0 :(得分:0)

假设各种标准所需的所有数据都包含在专辑数据中,并且每个标准都有助于总体得分,我建议将每个标准转换为将相册转换为分数的Java函数。然后,对于所有选定的条件,运行相册上的条件功能,并将各个结果合并为一个分数。然后,您可以将标准转换为枚举,这样可以轻松地将所选标准传递到您的评分函数中

如果每个标准不相等,您还可以使用分数返回权重因子(例如,星级评论可能是监听计数的两倍),使得给定标准的贡献是(分数*重量)/总和权重

答案 1 :(得分:0)

这里有两个设计问题:构建记分员和应用记分员。这些问题是几种设计模式的机会。

构建器可能是第一个问题的合适解决方案,具体取决于记分员本身的复杂程度。第二个问题是Strategy pattern的明确用例(来自@ V3V的答案也在描述)。每个“得分手”都是算法;策略模式是可替代算法的设计。可以使用Template method来实现算法的基线标准。