Рубрики

Шаблон стратегии | Комплект 1 (Введение)

Как всегда, мы изучим этот шаблон, определив проблему и используя шаблон стратегии для ее решения. Предположим, мы создаем игру «Street Fighter». Для простоты предположим, что у персонажа может быть четыре хода: удар, удар, бросок и прыжок. У каждого персонажа есть движения удара и удара, но бросок и прыжок необязательны. Как бы вы смоделировали свои занятия? Предположим, что изначально вы используете наследование и абстрагируете общие черты класса Fighter и позволяете другим персонажам наследовать класс Fighter .

Fighter class будет иметь стандартную реализацию нормальных действий. Любой персонаж со специализированным движением может переопределить это действие в своем подклассе. Диаграмма классов будет выглядеть следующим образом:

Какие проблемы с вышеуказанным дизайном?

Что если персонаж не выполняет прыжковое движение? Он по-прежнему наследует поведение перехода от суперкласса. Хотя вы можете переопределить переход, чтобы ничего не делать в этом случае, но вам, возможно, придется сделать это для многих существующих классов и позаботиться об этом и для будущих классов. Это также усложнит обслуживание. Таким образом, мы не можем использовать наследование здесь.

А как насчет интерфейса?

Взгляните на следующий дизайн:

Это намного чище. Мы вынули некоторые действия (которые могут не выполнять некоторые символы) из класса Fighter и создали интерфейсы для них. Таким образом, только символы, которые должны прыгать, будут реализовывать JumpBehavior.

Какие проблемы с вышеуказанным дизайном?

Основная проблема с вышеуказанным дизайном — повторное использование кода. Поскольку по умолчанию не существует реализации прыжкового поведения, у нас может быть двойственность кода. Возможно, вам придется много раз переписывать одно и то же поведение перехода во многих подклассах.

Как мы можем избежать этого?

Что если мы сделаем классы JumpBehavior и RollBehavior вместо интерфейса? Что ж, тогда нам пришлось бы использовать множественное наследование, которое не поддерживается во многих языках из-за многих проблем, связанных с ним.

Здесь стратегия спасения приходит нам на помощь. Мы узнаем, что такое шаблон стратегии, а затем применим его для решения нашей проблемы.

Определение:

Википедия определяет шаблон стратегии как:

«В компьютерном программировании шаблон стратегии (также известный как шаблон политики ) является шаблоном разработки программного обеспечения, который позволяет выбирать поведение алгоритма во время выполнения. Шаблон стратегии

  • определяет семейство алгоритмов,
  • инкапсулирует каждый алгоритм и
  • делает алгоритмы взаимозаменяемыми в этом семействе ».

 

Диаграмма классов :

Здесь мы полагаемся на композицию вместо наследования для повторного использования. Контекст состоит из Стратегии . Вместо реализации поведения Контекст делегирует его Стратегии . Контекстом будет класс, который потребует изменения поведения. Мы можем изменить поведение динамически. Стратегия реализована в виде интерфейса, так что мы можем изменить поведение, не влияя на наш контекст.

У нас будет более четкое понимание модели стратегии, когда мы будем использовать ее для решения нашей проблемы.

Преимущества:

  1. Семейство алгоритмов может быть определено как иерархия классов и может использоваться взаимозаменяемо для изменения поведения приложения без изменения его архитектуры.
  2. Путем инкапсуляции алгоритма отдельно можно легко внедрить новые алгоритмы, соответствующие одному и тому же интерфейсу.
  3. Приложение может переключать стратегии во время выполнения.
  4. Стратегия позволяет клиентам выбрать нужный алгоритм без использования оператора «switch» или ряда операторов «if-else».
  5. Структуры данных, используемые для реализации алгоритма, полностью инкапсулированы в классы стратегий. Следовательно, реализация алгоритма может быть изменена без влияния на класс Context.

Недостатки:

  1. Приложение должно знать все стратегии, чтобы выбрать правильную для правильной ситуации.
  2. Классы context и Strategy обычно взаимодействуют через интерфейс, заданный абстрактным базовым классом Strategy. Базовый класс стратегии должен предоставлять интерфейс для всех необходимых поведений, которые могут не реализовывать некоторые конкретные классы Стратегии.
  3. В большинстве случаев приложение настраивает контекст с помощью требуемого объекта «Стратегия». Следовательно, приложение должно создавать и поддерживать два объекта вместо одного.

 

Ссылки:

Эта статья предоставлена Сулабх Кумар. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Шаблон стратегии | Комплект 1 (Введение)

0.00 (0%) 0 votes