我不知道我是否可以完全回答你的问题,但我会尝试......
因此,我们有一堆只有在用户之前选择了一些答案时才对用户可见的视图,例如,如果她超过 30 岁,她将看到视图#3,如果她小于 30 岁并且来自中国,她将看到视图#4 , 如果她 40 岁以上并且来自西班牙或意大利,则查看#5,依此类推...我还想介绍 **step** 的概念,对于每一步,我们可以有 1、2 或更多相应的观点。每个视图都应该有一组规则(如上面的规则)来定义它是否显示。
如何创建这些规则?这些规则可以是过滤器类/接口的简单实例,当被询问时,应该返回真/假。像这样:
interface Filter {
boolean apply();
}
然后您可以创建过滤器,例如“30 岁以上”、“来自西班牙”等。请记住,每个视图都配置了一组规则(过滤器),因此如果被问及是否可以显示自己,它可以回答是/否。
接下来,如何应用这些过滤器?我们可以有一个只知道 **steps** 的控制器对象(每个步骤可以有一个或多个对应的视图,正如我所说的),并且,在用户在当前步骤按下 **next** 之后,它应该收集答案并根据附加到每个视图的规则应用它们。就像,从第一步中获取答案,并将它们应用于第二步中的所有视图,然后查看哪个匹配(返回 true)。例如,在第二步,您可以有两个单独的视图,一个用于年轻人,另一个用于老年人,您可以应用每个视图的规则来决定是显示老视图还是年轻视图。我可以给你一个代码示例,你也可以自己研究,因为我对你的技术环境一无所知。我在类似的问题上使用了 Google Guava 的谓词,这里是:假设我们正在处理 Witch 对象,每个对象都有 name(string)、age(int) 和 spells(collection) 属性。如果我有一个女巫列表,并且需要根据特定标准对它们进行排序,我可以这样做:
// first I want to sort witches by age(natural ordering) then by spells,
// and then by name lexicographically
Ordering.natural()
.compound(new BySpellsWitchOrdering())
.compound(new ByNameWitchOrdering())
.sortedCopy(witchList);
上面的代码行将获取女巫列表并根据标准返回一个排序好的女巫列表。你的情况很相似。
接下来,如何创建答案?对于每个视图(页面),您都有可能的答案,例如对于视图#1,您可以有:年龄、性别、种族、国家。您可以以字符串、整数、枚举的形式构造一些答案,然后将它们传递给控制器,然后控制器会将它们应用到与下一步对应的每个视图中。
至于如何将规则存储在数据库中,例如,您可以有一列定义规则名称(例如,OLDER THAN)和一列用于值,例如 30。同样,我对您的环境了解不多,这是一个非常普遍的问题,所以我将在这里停止......