Строка для Stategy в шаблоне стратегии - PullRequest
1 голос
/ 25 августа 2009

Я работаю в AS3, но я думаю, что это может быть общий вопрос, поэтому я сформулирую это более неопределенно ...

Я использую файл XML для определения параметров для определенного класса объектов, который реализует шаблон стратегии. Там будет большое разнообразие объектов, и это работает для нас как дружественное дизайнерское решение для настройки этих объектов. Поскольку я могу определять только строки в файле XML, может ли кто-нибудь предложить аккуратный способ взять эту строку и реализовать правильную стратегию?

У меня были две начальные мысли. Во-первых, передать строку конструктору объекта, а затем создать в нем объект Switch Case, который применяет правильную стратегию.

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

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

Будем благодарны за любые дополнительные предложения!

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Вы хотите, чтобы какой-то шаблон проектирования фабрики выбирал соответствующий класс на основе входной строки. Хорошим примером этого является Registry, где применимые классы «регистрируют» себя с помощью одноэлементного класса Registry, подходящего для определенной входной строки; Сама фабрика становится поиском строки в зарегистрированном классе. Некоторый запасной вариант должен присутствовать, когда ни один класс не зарегистрирован для запрашиваемой входной строки: либо это исключение, либо есть реализация «по умолчанию», которая используется, когда не применяется более конкретная - последняя является хорошей опцией fail-soft , но не всегда применимо.

Неизбежная проблема с Registry заключается в том, как найти все интересующие классы и убедиться, что они регистрируются самостоятельно (это особенно интересно для классов плагинов); лучшие решения этой проблемы скорее зависят от конкретного языка под рукой, и, к сожалению, я не уверен, что AS3 обеспечивает в этом отношении (или если вы вообще заинтересованы в такой динамической расширяемости).

Другая интересная проблема с Registry - это «конфликты» - что происходит, если более чем один применимый класс заявляет, что он является правильным для определенной входной строки. «Последний претендует на победу» является самым простым, но часто слишком простым; у вас может быть каждый регистр классов для нескольких входных строк с определенным «приоритетом» или «приоритетом», или же (не очень интересный в системах, которые не распределены, но крайне важны для распределенных систем ...) «баланс нагрузки» среди всех применимые «серверы» (циклический перебор или более изощренные способы).

Вы заметите, что эти решения больше похожи на ваше второе, чем на первое, но ключевое отличие состоит в том, что вместо хрупкого, жесткого и жестко запрограммированного переключателя (OOP bete noire ;-) они полагаются на гибкие отображения из строка в класс (или метод конструирования класса, делегат и т. д., в зависимости от деталей языка реализации - например, в Java у вас может быть интерфейс StrategyConstructing, каждый класс стратегии будет затем регистрировать свой собственный вспомогательный класс, реализующий эту стратегию, когда он зарегистрируется до Реестр).

0 голосов
/ 25 августа 2009

да, Алекс указал верный путь ...

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

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

Greetz

back2dos

...