.Net developer, data scientist
Всем привет. Тема видео – паттерн «Состояние». Данный паттерн интересен тем, что можно подобрать много жизненных ситуаций, которые могли бы быть примерами использования данного шаблона.
Что нас ждет в сегодняшнем видео:
В природе практический любой предмет имеет определенное состояние. Если речь идет о бытовых предметах, то можно сказать, что они существуют в двух состояниях «исправный» и «поврежденный». В случае если объект исправный, то это состояние может быть разделено на 2 состояния «Готовый к использованию» и «Не готовый к использованию». Тоже применимо и к человеку – человек может быть здоровым, больным, бодрствующим, спящим. В зависимости от этих состояний нам может быть доступна определенная «функциональность» или, наоборот, функциональность может быть ограничена. Например, если состояние человека – «болен», то такой человек не может работать. Применимо к объектному программированию, прилагательные, которые описывают человека, являются состояниями, а человек, в этом случае, является контекстом. То есть контекст может иметь разные состояния. В зависимости от того, в каком состоянии находится контекст, он может выполнять, или наоборот не выполнять, определенную функциональность. Тут приходит в голову автомат по продаже прохладительных напитков. Если в автомате закончились товары, то автомат будет в состоянии «Товар отсутствует». В данном состоянии автомат не будет продавать напитки, т. е. функциональность ограничена, с другой стороны, автомат будет в состоянии принять новые товары, то есть появилась дополнительная функциональность «Прием товара», которая была недоступна, когда автомат был полностью загружен.
Из объяснения выше следует, что если вы имеете дело с объектом, который может принимать различные состояния, то данный паттерн – это то, что вам надо и его в данном случае необходимо использовать. В качестве практического примера я покажу вам имплементацию оператора кол-центра. Телефонный оператор может пребывать в 4 состояниях, которые обозначены зелеными прямоугольниками. В зависимости от того в каком состоянии пребывает клиент, он может или не может принять звонок, может составлять отчет о звонке или быть на перерыве. Исходным состоянием является состояние «Свободный», когда оператор может принимать или сбрасывать звонки, а также уходить на перерыв.
Как работает данный шаблон:
В данный момент мы можем сформулировать, когда данный шаблон будет работать неправильно. Такая ситуация может наступить в том случае, когда мы не сможем выйти из определенных состояний на основании нашей логики. Посмотрите на схему. Если в «Состоянии 4» мы перейдем в «Состояние 5», то наш объект сможет переходит только в «Состояние 6» и обратно. Состояния 1, 2, 3, 4 будут недоступны для такого объекта. Мой совет – перед тем, как что-то запрограммировать с использованием паттерна «Состояние», нарисуйте схему переходов из одного состояния в другое и проверьте нет ли у вас такой ситуации, когда объект заходит в тупик и не может выйти из определенного состояния. Также чтобы избежать такой неприятной ситуации, необходимо определить одно состояние, как главное, обычно это первое состояние объекта и создайте схему изменений состояний таким образом, чтобы объект всегда мог вернуться в главное состояние. В практическом примере, который мы будем рассматривать, таким главным состоянием будет «Свободный».
Давайте посмотрим на код и запустим наш пример.
Возможно сейчас, после практического примера у Вас появилось чувство дежавю. Паттерн «Состояние» как бы копирует паттерн «Стратегия». Можно сказать, что каждый класс состояния, которые реализует интерфейс состояния, является стратегией. И вроде бы оба паттерна работают подобно, однако есть важно различие. В шаблоне «Стратегия» мы можем использовать бесконечное множество классов, которые реализуют определенный интерфейс стратегии, и мы можем изменять эти стратегии на лету. С другой стороны, в шаблоне «Состояние» мы имеем определенное конечное число состояний и изменение этих состояний происходи внутри объекта.
Для самостоятельного изучения тематики паттерна «Состояние» я рекомендую вам поискать в англоязычном интернете статьи на тему „Finite State Machine”, т.е. в переводе на русский «машина конечных состояний», а в русскоязычных источниках данное определение называется «конечный автомат». На данный момент у меня по этому шаблону всё. Я благодарю Вас за внимание.
Недавно я узнал, что для продвижения канала важны не только лайки, подписки и положительные комментарии, но и количество комментариев, поэтому если Вы просто оставите любой комментарий под данным видео, связанный с шаблонами проектирования, я будут очень вам благодарен. Просьбы поставить лайк и подписаться, если вы не подписаны, остаются в силе. Благодарю вас за внимание и до новых встреч.
Пример кода из видео на GitHub
Для открытия файла проекта необходимо Visual Studio 2019.