Я хочу реорганизовать некоторый код.
В основном код, который я хочу реорганизовать, - это форма (с использованием System.Windows.Forms;)
Теперь он настраивается, в зависимости от того, какой переключатель вы выбрали, показывает другой макет для окна: разные метки, кнопки и т.д. Не всегда большая разница, но другая. Это много условных высказываний по всему месту. Я хотел вместо этого реорганизовать его с помощью шаблона штата. Существует три основных состояния.
Я не уверен, что это лучший способ. В настоящее время интерфейс IState имеет метод DoAction(), который выполняет некоторые действия, специфичные для уникального состояния, и метод DrawForm(), который повторно рисует форму на основе текущего состояния... Однако, чтобы сделать DrawForm(), классы состояний должны иметь доступ к переменным-членам формы. Это меня бросило в петлю. Я действительно не хотел их раскрывать.
Есть ли лучший способ сделать это?
Вы можете сделать ваши классы состояний вложенными в вашу форму. Затем они смогут использовать поля формы, не открывая их.
Если ваша основная забота заключается в том, что содержимое инкапсулированной формы заполнено, и вы хотите, чтобы государственная машина была снаружи, у меня был подобный вопрос некоторое время назад, вы могли бы проверить ответ здесь - в основном это связано с созданием частного внутреннего класса "action", который имеет доступ к методам формы, а затем передает его на конечный автомат, чтобы он мог использовать класс действия для косвенного вызова методов формы.
Чтобы получить "состояние" формы, вы описываете шаблон, более известный как "модель представления". Вы найдете хорошую информацию и советы о том, как обычно вы хотите, чтобы форма и состояние взаимодействовали, прочитав эту статью Мартина Фаулера. В вашем случае ваша форма - это "Вид", и ваше государство является моделью презентации. Как всегда, Фаулер отлично справляется с этим вопросом и многое другое.
Я не знаю, помогает ли это, но почему бы не иметь что-то вроде шаблона стратегии для рисования формы?
Итак, что-то вроде строк
interface IDrawStrategy
{
void Draw(FormType form);
}
И затем, когда вы выбираете, в каком состоянии находится форма, вы можете назначить стратегию рисования формы. Да, вам все равно нужно предоставить доступ методу draw к переменным Forms, чтобы он мог их расположить, но он по крайней мере позволяет вам упростить добавление разных взглядов на основе состояний.