Могут ли объекты ConcreteState вносить изменения в контекст, в котором они находятся? - PullRequest
0 голосов
/ 30 июня 2018

Это цитата, которую я, возможно, неправильно истолковал в этом разделе книги «Шаблоны проектирования, элементы многоразового объектно-ориентированного программирования».

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

Если ConcreteState передается контекст из Request(this);, разрешено ли этому государству вносить изменения в сам контекст?

В примере, над которым я работаю, контекст является Windows Form с такими состояниями, как FormStart и FormStop. Я хотел бы внести изменения, чтобы при изменении состояния некоторые кнопки в форме были отключены / недоступны. Насколько я знаю, конструктору ConcreteState можно было передать контекст в качестве аргумента, а затем состояние могло бы внести изменения в контекст.

Определения, с которыми я работаю:

  • Контекст: определяет интерфейс, представляющий интерес для клиентов
  • Состояние: определяет интерфейс для инкапсуляции поведения, связанного с конкретным состоянием контекста.
  • ConcreteState: каждый подкласс реализует поведение, связанное с состоянием контекста

1 Ответ

0 голосов
/ 30 июня 2018

Шаблон STATE не запрещает государству вносить изменения в Context.

Цитата из раздела Пример кода главы STATE книги GoF:

TCPState [...] также может изменить состояние TCPConnection

TCPConnection - это Context в этом случае.

Код показывает еще один пример состояния, изменяющего контекст:

void TCPEstablished::Transmit(TCPConnection* t, TCPOctetStream* o) {
    t->processOctet(o);
}

Передача чего-либо в TCPConnection может вызвать изменение в этом TCPConnection.

Так что, безусловно, да, это разрешено.

...