Как моделировать каскадные настройки в иерархии объектов - PullRequest
1 голос
/ 12 февраля 2010

Пытаюсь разобраться, как смоделировать понятие значений по умолчанию в иерархии объектов. Эти значения по умолчанию должны применяться ко всем объектам в иерархии, если только объект не переопределяет настройку. Если параметр переопределен, он и все его дочерние элементы получат переопределенное значение, но другие значения будут извлечены из иерархии вверх.

Может быть, пример поможет. Рассмотрим систему, которая моделирует планирование спортивных игр. На вершине находится спортивный объект. Этот объект содержит набор лиг, а лига содержит набор сезонов. Сезон содержит набор расписаний, а график содержит набор игр:

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 {
}

Возможно, есть объект по умолчанию, который выглядит примерно так:

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

Таким образом, объекту «Спорт» для «Футбол» будет принадлежать объект «По умолчанию», в котором указано:

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"]

Что было бы хорошим способом смоделировать это? Существует ли существующий шаблон дизайна для него? Я пытался найти решения для Google, но мне сложно выбрать правильные ключевые слова. Если кто-то может указать мне на онлайн-ресурс или примеры этого, я был бы очень признателен! Я реализую это на Java, но буду смотреть на примеры во всем.

Одна технология, о которой я могу подумать, похожа на то, как работает CSS в браузере. Значения располагаются вниз по иерархии, причем каждый узел может переопределять значения сверху. Будет ли это правильный подход? Как бы я смоделировать это на Java? Как бы я сохранил это и запросил его через Hibernate?

Мое последнее беспокойство заключается в том, как обращаться с настройками по умолчанию, которые относятся только к определенному набору объектов в иерархии. Например, в CSS значение «ширина», вероятно, не имеет смысла для элемента «скрипт». В CSS эта настройка, вероятно, просто игнорируется, но если бы я это сделал, мой объект по умолчанию был бы таким большим классом со всеми возможными настройками, которые могут понадобиться любому объекту в системе. Что означает «requiredRefereePositions» для объекта Venue? Не уверен, что это лучший путь.

1 Ответ

1 голос
/ 12 февраля 2010

Если вы посмотрите на класс Properties , я думаю, что он предоставит вам либо решение, либо стратегию для решения.

Я бы посоветовал вам , а не попытаться вставить метод получения значений по умолчанию в вашу объектную модель - что нарушает принцип разделения задач - вместо этого передать свойства конструктору. Скорее всего, встроенный класс Properties сделает то, что вы ищете, и обеспечит уровень развязки, о котором вы спрашиваете.

Если вы недовольны поиском на основе строк, вы можете реализовать нечто подобное, используя перечисления или даже специальные вызовы getXXX в своем собственном пользовательском классе. Ключ в том, что класс получит делегата в своем конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...