1

试图思考如何在对象层次结构中对默认值的概念进行建模。这些默认值应适用于层次结构中的所有对象,除非对象覆盖了设置。如果一个设置被覆盖,那么它及其所有子项将获得覆盖的值,但其他值将从层次结构中拉出。

也许一个例子会有所帮助。考虑一个模拟体育比赛日程的系统。在顶部,有一个 Sport 对象。此对象包含一组联赛,而联赛包含一组赛季。一个赛季包含一组赛程,一个赛程包含一组比赛:

class Sport {
    private Set<League> leagues;
}
class League {
    private Set<Season> seasons;
}
class Season {
    private Set<Schedule> schedules;
}
class Schedule {
    private Set<Game> games;
}
class Game {
}

也许有一个 Defaults 对象有点像这样:

class Defaults {
    private Set<Venue> venues;
    private Set<Weekday> weekdays;
    private int gameDuration;
    private Set<RefereePositions> requiredRefereePositions;
}

因此,“Soccer”的 Sport 对象将拥有一个 Defaults 对象,该对象指定:

venues: ["Field 1","Field 2", "Field 3", "Field 4", "Field 5"}
weekdays: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
gameDuration: 90
requiredRefereePositions: ["Referee","Linesman 1","Linesman 2"]

然后,联盟可以覆盖这些设置,也许:

venues: ["Field 4","Field 5"]
weekdays: ["Sat","Sun"]

季节可以覆盖设置,时间表也可以。也许某个比赛时间表是针对低级别比赛的,并且只需要一名裁判。因此,计划可能会覆盖默认值:

requiredRefereePositions: ["Referee"]

因此,这意味着当调度系统运行并尝试在该时间表内安排比赛时,它会知道比赛应该安排在“第 4 场”或“第 5 场”,应该在周六或周日,应该是90 分钟,并有一名裁判:

venues: ["Field 4","Field 5"]
weekdays: ["Sat","Sun"]
gameDuration: 90
requiredRefereePositions: ["Referee"]

对此进行建模的好方法是什么?是否有现有的设计模式?我一直在尝试在谷歌上寻找解决方案,但很难选择正确的关键字。如果有人可以向我指出在线资源或这样做的示例,我将不胜感激!我正在用 Java 实现它,但会查看任何示例。

我能想到的一种类似的技术是浏览器中的 CSS 是如何工作的。值在层次结构中向下级联,每个节点都能够覆盖更高层的值。这是正确的方法吗?我将如何在 Java 中建模?我将如何保存它并通过 Hibernate 查询它?

我最后关心的是如何处理仅与层次结构中特定对象集有关的默认设置。例如,在 CSS 中,值“width”对于“script”元素可能没有意义。在 CSS 中,该设置可能只是被忽略了,但如果我这样做了,我的 Defaults 对象将是一个包含系统中任何对象可能需要的所有可能设置的大类。“requiredRefereePositions”对 Venue 对象意味着什么?不确定这是否是最好的方法。

4

1 回答 1

1

如果您查看Properties类,我认为它将为您提供解决方案或解决方案的策略。

我鼓励您不要尝试将默认值的 getter 放入您的对象模型中——这违反了关注点分离的原则——而是将属性传递给构造函数。内置的 Properties 类很可能会满足您的需求,并提供您所要求的解耦级别。

如果您对基于字符串的查找不满意,您可以使用枚举实现类似的功能,甚至可以在您自己的自定义类中执行特定的 getXXX 调用。关键是该类将在其构造函数中接收委托。

于 2010-02-12T06:06:01.847 回答