表示对象中优先级/首选项的最佳方法是什么?

时间:2012-05-01 15:02:04

标签: java oop design-patterns domain-driven-design

对域中的优先级/偏好进行建模的最佳方法是什么? 例如。假设我有一个代表一个人的班级Person并且有一些偏好,例如PersonX喜欢披萨,spaggetti和omelete,实际上他更喜欢spagetti而不是比萨饼。
这些最好的模型是什么? 第一个想法是将它们放在List(作为Person的成员变量)中,根据插入顺序保留首选项,例如列表中的第一个是最喜欢的,然后列表中的第二个是最喜欢的第二个但是在我看来最终太繁琐了。例如。当我想做偏好等搜索或关联时。
也许这样的问题有一个标准的方法吗?

4 个答案:

答案 0 :(得分:1)

您可以按照建议使用列表,并向Person类添加一个返回Comparator<Preference>的方法,该方法可以比较该人的2个偏好:

Person somebody.addPreference(pizzaPreference);
Person somebody.addPreference(omelettePreference);
....
Comparator<Preference> c = somebody.getPreferenceComparator();
boolean prefersPizzaOverOmelette = (c.compare(pizzaPreference, omelettePreference) > 0);
boolean hasNoPreferenceBetweenPizzaAndOmelette = (c.compare(pizzaPreference, omelettePreference) == 0);

比较器只会检查列表中首选项的索引(如果它包含该首选项等)。

答案 1 :(得分:1)

您可以使用priority queue来表示对象优先级,并为您的类定义适当的Comparator,并考虑所描述的规则。该队列使用优先级堆,该优先级堆将负责维护在插入时按优先级排序的对象。

答案 2 :(得分:1)

使用这样的类结构......(原谅Java马哈哈......我是C#家伙)

public class PersonPreference
{
     public Preference preference;
     public int rank;
}

然后,允许您的用户对其偏好进行排序(因此,排名列),并在必要时对该属性/列进行排序。

修改

再看一遍,我想重新定义我的课程。与其他人相比,偏好应该是用户的喜欢......

public class PersonLike
{
     public string like;
     public int rank;
}

这个新类定义了一个人喜欢的东西,它允许排名,这样当你有这个类的许多实例(或它的数据表示)时,可以对它们进行排序,这会产生偏好,因为偏好本质上是一个用户喜欢别的东西。一个喜欢本身不是一个偏好,因为它没有与其他任何东西进行比较。

这种方法允许将n个兴趣相互排名,创建大量偏好。

答案 3 :(得分:1)

Preference整体上是一个完整的实体,虽然没有任何意义,除非它与任何Person相关联,但可以独立存在。

就偏好优先权而言,Preference没有任何优先权Omelet,Pizza都是相似的,但是当它与一个人相关时它具有优先权(比如我喜欢披萨而不是煎蛋卷,取决于我,不是披萨或煎蛋卷。)

所以你有一个PreferencePerson对象。

现在,偏好因人而异,因此您将偏好与人关联。

由于优先级非常依赖于Person,因此您可以实现多种选择:

  1. 使用PriorityQueue - 添加首选项时指定优先级。此队列将出现在Person类本身
  2. 使用自定义比较器(由@assylias建议)
  3. 将规则添加到首选项(基于位置,性别,e.t.c。)并具有预先配置的规则,当给定某些条件时,将返回由System计算的首选项,但手动覆盖此规则。 在这种情况下,您只需使用PriorityQueue