Шаблон проектирования Команда (Command)

Четвертый шаблон проектированя — Команда.

Суть — инкапсуляция запроса в виде объекта, который содержит само действие и параметры. А если простыми словами, отделяем детали запроса от класса, который их создает.

Перейдем от мутных слов к простому коду. Рассмотрим пример шаблона на приложении андроид для перевода текста (с англ. языка на русский и обратно для начала). Опять же пример очень упрощен чтобы показать суть шаблона.

Все начинается с интерфейса команды

У него одна единственная функция исполнения, параметром прокинем ему источник текста. Далее нам нужны 2 реализации этого интерфейса.

Эта имплементация для случая перевода с англ. языка на русский, здесь класса принимает в конструкторе некий класс, который отвечает за предоставление данных (это может быть как база данных так и некий интерактор, который будет отправлять запросы в сеть). Аналогично этому классу напишем второй, для перевода с русского языка на английский.

Здесь мы также обращаемся к некоему классу Dictionary, где можем получить данные (кстати, можно бы было упростить все с помощью возврата метода самой строки у метода execute).

Рассмотрим быстренько сам класс, который предоставляет данные (очень упрощено).

Здесь у нас некая база данных (мапа с данными) и имплементация методов перевода. Также мы будем прокидывать интерфейс колбэка для простановки перевода в юзер интерфейс.

Но это не все. Еще нам нужен некий класс, который будет отвечать за вызов команды.

Здесь все просто, проставляем команду и вызываем ее метод (команды будем менять часто, потому сеттер, а не параметр конструктора).

Чтобы все это протестировать нам нужна разметка главного экрана, выглядит она примерно так — переключатель языка, поле ввода, текстовка перевода и кнопка перевода текста.

И рассмотрим конечный класс экрана.

Инициализируем элементы экрана, создаем 2 команды для перевода, инициализируем вызывающий класс, словарь и проставляем ему интерфейс колбэка, задаем начальную команду по умолчанию с английского на русский и проставляем обработчик переключателя, который будет менять команду у вызывающего класса.

При нажатии на переключатель меняется команда (языки перевода), а при нажатии на кнопку перевода вызывается метод у класса Invoker, который вызывает единственный метод у интерейса команды и в зависимости от установленной команды будет происходить инкапсулированное действие нужной конкретной команды.

Посмотрим скриншоты чтобы внести ясность.

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

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

Минусы — сложность самого шаблона (которая на среднем уровне на самом деле).

Запись опубликована в рубрике Программирование Android, Программирование Java. Добавьте в закладки постоянную ссылку.