Я пытаюсь применить шаблон «Стратегия» к конкретной ситуации, но у меня возникла проблема с тем, как избежать привязки каждой конкретной стратегии к объекту контекста, предоставляющему данные для нее. Ниже приведен упрощенный случай шаблона, который происходит несколькими различными способами, но должен обрабатываться аналогичным образом.
У нас есть объект Acquisition
, который предоставляет данные, относящиеся к определенному интервалу времени - в основном это набор внешних данных, собранных с использованием различных аппаратных средств. Он уже слишком велик из-за количества данных, которые он содержит, поэтому я не хочу давать ему дополнительную ответственность. Теперь нам нужно взять некоторые из этих данных и, основываясь на некоторой конфигурации, отправить соответствующее напряжение на аппаратное обеспечение.
Итак, представьте следующие (очень упрощенные) классы:
class Acquisition
{
public Int32 IntegrationTime { get; set; }
public Double Battery { get; set; }
public Double Signal { get; set; }
}
interface IAnalogOutputter
{
double getVoltage(Acquisition acq);
}
class BatteryAnalogOutputter : IAnalogOutputter
{
double getVoltage(Acquisition acq)
{
return acq.Battery;
}
}
Теперь каждый конкретный класс стратегии должен быть связан с моим классом Acquisition, который также является одним из наиболее вероятных классов для изменения, поскольку он является ядром для нашего приложения. Это все еще улучшение по сравнению со старым дизайном, который был гигантским оператором switch внутри класса Acquisition
. У каждого типа данных может быть свой метод преобразования (хотя «Батарея» - простой переход, другие не так уж просты), поэтому я считаю, что стратегия или аналогичный метод должны быть подходящим способом.
Также отмечу, что в окончательной реализации IAnalogOutputter
будет абстрактным классом, а не интерфейсом. Эти классы будут в списке, который настраивается пользователем и сериализуется в файл XML. Список должен редактироваться во время выполнения и запоминаться, поэтому Serializable должен быть частью нашего окончательного решения. В случае, если это имеет значение.
Как я могу обеспечить, чтобы каждый класс реализации получал данные, необходимые для работы, без привязки его к одному из моих самых важных классов? Или я подхожу к такой проблеме совершенно неправильно?