В чем разница между паттерном Стратегия и Состояние?

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2023

Изучаю сейчас программирование на Unity. 3 дня ломаю голову над вопросом в чем отличие паттерна Стратегия(Strategy) от Состояния(State). Смотря через призму Unity я совсем не понимаю в чем разница, и в какой ситуации какой паттерн выгоднее реализовывать. Информации в интернете не так уж много по этой теме, по крайней мере я не нашел что искал. Можете бить ссаными тряпками, мол плохо гуглил, только дайте ответ, пожалуйста. У меня ощущение, что я упустил важную деталь и ответ где-то близко, но из-за небольшого опыта мне сложно понять. Для тех кто может объяснить преложил свою реализацию этих паттернов, как я их вижу. Скорее всего проблема в реализации и я из-за этого не могу понять суть. Код максимально урезан для удобочитаемости. Состояние Стратегия.

Ответы

▲ 1Принят

Видимо тебе показалось, что Стратегия, это как Состояние, которое мы не меняем и в принципе так и есть, в единицу времени мы работаем с всего одной реализацией из многих под общей абстракцией, одна и та-же концепция. На тему что у них вообще общего? от @Grundy.

Даже стратегия-фасад, когда одна стратегия это набор из нескольких не уникальна, можно написать и состояние-фасад, хоть это и вряд-ли имеет смысл. Да, самое сложное состояние final-state-mashine ни с какой стратегий не сравнить, но тогда у новичка может возникнуть вопрос, а нахрена эта стратегия ваще нужна?


Все просто.

Когда мы шарим картинку с текстом в социалку на выбор у каждой из которых собственная библиотека, используется стратегия. Или когда одна и та-же игра запускается под DerictX, OpenGL или другим графическим api, она выбирает стратегию для рендера и это может не ограничиваться всего одним классом, речь может быть о целых фреймворках и о легкой смены с одной стратегии на другую в реальном времени не может быть и речи, множество сущьностей из-за выбранной стратегии проинициализировались особым способом и нужно начинать весь процесс с начала. Или квесты в играх, их условия выполнения это стратегия принеси N(количество), I(предмет), убей N, M(монстр), фасад из нескольких разом или фасад одно из двух, тоже самое касается условий провала квеста за T(время), нанести урон M(не трогать), это буквально одни и те-же стратегии, которые просто в разных полях выполнение/провал.

Когда юнит в рпг или стратегии(жанр) постоянно скачет от одного к другому и обратно: стоит/бежит/атакует/умирает то он меняет состояния. Когда мы настраиваем анимацию в окне Animator, это редактор состояний с регламентированными переходами, тот самый вышеупомянутый final-state-mashine.


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