Найти тему
Ржавый код

Дизайн шаблонов в Rust - команда, простая реализация универсального шаблона

Введение

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

Выглядит так:

-2

Короткое устройство этой диаграммы:

  • `Invoker` - это объект, который хочет выполнить команду или последовательность команд для некоторых неизвестных объектов, то есть вызывающий может не знать о них.
  • Интерфейс `Command`. Многие классы могут реализовать этот интерфейс.
  • В этом примере существует только один класс, реализующий интерфейс `Command`, который работает с `CommandA`. Как вы видите, `Invoker` и `Receiver` не связаны, и единственная связь между ними осуществляется через `Command`.

Реализация в Rust

В пустой папке откройте командную строку или терминал и введите:

-3

Теперь откройте файл `main.rs` в каталоге `src/`.

Начнем с определения трейта Command:

-4

Для простоты имеет только метод: `execute()`, который выполняет команду.

Начнем с определения очень простой команды:

-5

Этот код вполне самозаверяющий: у нас есть конструктор, `new()`, который устанавливает сообщение. Далее мы реализуем метод `execute()` трейта `Command`, который просто печатает сообщение.

Несколько более сложный пример:

-6

Объяснение:

  1. Структура `MultiplyCommand` имеет два поля `i32`.
  2. Мы задаем их в конструкторе `new()`.
  3. Метод `execute()` перемножает эти поля и выводит соответствующее сообщение.

Нам также нужен объект для вызова или выполнения следующих команд:

-7

Некоторое объяснение:

  1. Структура `Invoker` содержит команды списка в виде `Vec<Box<dyn Command>>`. Команда `dyn` необходима, потому что нам нужна динамическая диспетчеризация, поскольку команда является трейтом. `Box` необходимо, поскольку размер объектов, добавленных в вектор, неизвестен.
  2. В конструкторе `new()` этот вектор инициализируется.
  3. Метод `add_command()` добавляет к вектору новую структуру, реализующую трейт `Command`.
  4. В методе `execute_commands()` выполняется итерация по вектору и выполнение каждой команды.

Теперь мы можем проверить его:

-8

Объяснение:

  1. Создается объект `Invoker`. Это должно быть изменяемым, так как мы собираемся добавить к нему команды.
  2. Затем мы добавим две команды: одну команду `PrintCommand` и одну команду `Multiplycommand`. Обратите внимание на то, как обе эти команды передают `Box`.
  3. Затем мы выполним все эти команды.

Вывод

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

Статья на list-site.