Паттерн состояний против полиморфизма - PullRequest
0 голосов
/ 09 мая 2020

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

1 Ответ

1 голос
/ 10 мая 2020

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...