Шаблон состояния: почему контекстный класс не реализует и не наследует абстрактный интерфейс / класс State?
Я читаю о государственном образце. Я только начал, поэтому, конечно, я начинаю с прочтения всей статьи в Википедии.
Я заметил, что оба примера в статье имеют некоторый базовый абстрактный класс или интерфейс Java для общих методов / функций State. Тогда есть некоторые состояния, которые наследуются от базы и реализуют эти методы / функции по-разному. Тогда есть класс Context, который имеет закрытый член типа State и который в любой момент может быть равен экземпляру одной из реализаций. Этот контекстный класс также реализует те же методы и передает их в текущий экземпляр состояния, а затем имеет дополнительный метод для изменения состояния (или, как я понимаю, в зависимости от конструкции изменение состояния может быть реакцией на один из реализованных методов),
Почему этот контекстный класс специально не "расширяет" или "не реализует" базовый базовый класс / интерфейс State?
1 ответ
Потому что состояние - это деталь реализации, а не часть его интерфейса. Т.е. контекст не является государством, у него есть только государство. Пользователям контекста даже не нужно знать о его состоянии.
Согласно GOF, это буквально говорит:
'Контекст может передать себя в качестве аргумента объекту состояния, обрабатывающему запрос. Это позволяет объекту State при необходимости обращаться к контексту ".
Глядя на их пример TCPConnection/TCPState, TCPState содержит конкретную ссылку на TCPConnection.
Таким образом, становясь более абстрактным, конкретное состояние может содержать ссылку на конкретный объект контекста состояния с целью установки нового состояния. Однако я также видел, как Subject/Observer использовался для обновления состояния вместо StateContext->setState(State).
Я также видел, как у людей есть StateContext, реализующий интерфейс State для интерфейса, зависящего от предметной области.