如何在对象层次结构中建模级联设置

时间:2010-02-12 05:10:55

标签: java design-patterns oop data-modeling

试图了解如何在对象层次结构中建模默认值的概念。除非对象覆盖设置,否则这些默认值应该应用于层次结构中的所有对象。如果覆盖了某个设置,那么它及其所有子项将获得被覆盖的值,但其他值将从层次结构中提取。

也许一个例子会有所帮助。考虑一个模拟体育比赛日程安排的系统。在顶部,有一个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"]

季节可以覆盖设置,也可以覆盖时间表。也许某个游戏时间表适用于低级别游戏,只需要一个裁判。因此,Schedule可能会覆盖默认值:

requiredRefereePositions: ["Referee"]

因此,这意味着当调度系统运行并尝试在此时间表内安排游戏时,它会知道游戏应该安排在“Field 4”或“Field 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对象意味着什么?不确定这是否是最佳方式。

1 个答案:

答案 0 :(得分:1)

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

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

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