- Почему класс
TVContext
реализует State
и имеет состав вместе?
Пример неверен, TVContext
не должен реализовывать интерфейс State
.Из диаграммы UML для шаблона проектирования состояний видно, что класс Context
составляет только атрибут, реализующий интерфейс State
.
Если последний программист в этом TestClass передает
context в
context.setState()
вместо
tvStartState или
tvStopState , программа успешно компилируется, но с ошибками в run_time.
Причина, по которой он компилируется, заключается в том, что context реализует интерфейс State
, но он не работает во время выполнения с java.lang.StackOverflowError
, потому что функция context.setState()
рекурсивно вызывает себя без выходасостояние.Удаление интерфейса State
из класса TVContext
устраняет эту проблему.
В Pattern Design Pattern цель состоит в том, чтобы добавить новое поведение в класс Component .Вот почему наследование используется для добавления новых методов в Component .
В State Design Pattern цель состоит в том, чтобы изменить поведение класса Context .Например, если мы реализуем его, используя наследование с абстрактным классом вместо интерфейса, операция над классами конкретного состояния должна переопределить операцию, определенную в абстрактном классе.Вот почему интерфейс имеет больше смысла в этом случае.