Паттерн состояний против полиморфизма

Я новичок в шаблонах проектирования, когда я посмотрел на диаграмму классов состояний, я обнаружил, что это просто примененный полиморфизм. В этом нет ничего особенного. Я ошибаюсь?

1 ответ

Полиморфизм - это механизм, который можно использовать для реализации объектно-ориентированного моделирования, известного как шаблон состояния. При использовании шаблона состояния у вас есть один логический объект (который может быть реализован как указатель на реализацию), а в течение его времени жизни вы можете переключать его между реализациями в зависимости от его текущего состояния. Каждое состояние имеет тенденцию работать независимо, поэтому вы можете независимо изучить реализации, чтобы понять поведение в этом состоянии.

Вам не обязательно использовать полиморфизм таким образом. Например, у вас могут быть логические объекты, созданные фабрикой на основе некоторой конфигурации, считанной во время запуска процесса, и после создания объекты сохраняют свой тип среды выполнения до тех пор, пока процесс не завершится и они не будут уничтожены. Или у вас может быть базовый класс, который представляет, скажем, сетевое устройство, и использовать реализацию, соответствующую вашему оборудованию, без изменения типа среды выполнения, поскольку оборудование выполняет разные задачи - в этом случае вы также используете полиморфизм, не являясь состоянием шаблон, даже если одна реализация (один производный тип) может отслеживать состояние сетевого устройства с использованием различных переменных-членов.

Некоторые объекты могут длиться не весь жизненный цикл процесса, но по-прежнему не изменят реализации - например, простая программа рисования может позволить вам выбирать между различными реализациями Shape для добавления на диаграмму, но, выбрав круг, не позволяет вам изменять его в квадрат - вам придется удалить круг и вместо этого вставить квадрат. Круг и Квадрат не могут быть состояниями, между которыми можно переключаться между формами. В некоторых играх они могут быть такими: возможно, объект Circle перейдет в объект Square, чтобы указать что-то о нем, например, текущий уровень повреждений или время, оставшееся до взрыва. Таким образом, использование конкретных реализаций для шаблона проектирования состояния не обязательно является неотъемлемой частью отношения полиморфного происхождения - это может быть связано с тем, как клиентский код изменяет один и тот же логический объект.

Полиморфизм нередко используется даже тогда, когда нет намерения создать несколько реализаций - это можно использовать аналогично идиоме pImpl в C++, как то, что называется "брандмауэром компиляции", главным образом для сокращения времени сборки. Тем не менее, некоторым людям просто нравится проектировать всю свою систему с использованием абстрактных классов, используя полиморфизм везде, независимо от того, нужен он или нет.

Шаблоны состояний, как правило, хороши для таких вещей, как обработка обратного вызова для TCP-соединения - вы можете переходить между состояниями, которые имеют поведение, относящееся только к ответам или событиям соединения, которые вы могли бы получить дальше, что делает код более понятным и поддерживаемым.

Другие вопросы по тегам