gpt4 book ai didi

java - 如何对对象层次结构中的级联设置进行建模

转载 作者:太空宇宙 更新时间:2023-11-04 08:56:09 25 4
gpt4 key购买 nike

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

也许一个例子会有所帮助。考虑一个对体育比赛的安排进行建模的系统。顶部有一个 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;
}

因此,“足球”的 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"]

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

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

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

最佳答案

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

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

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

关于java - 如何对对象层次结构中的级联设置进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2249806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com