Рубрики

Шаблон команды

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

Вы можете сделать это с помощью простых операторов if-else, таких как

if (buttonPressed == button1)
     lights.on()

Но мы должны помнить, что включение некоторых устройств, таких как стерео, включает в себя много шагов, таких как настройка CD, громкости и т. Д. Также мы можем переназначить кнопку, чтобы сделать что-то еще. Используя простой if-else, мы кодируем реализацию, а не интерфейс. Также есть жесткая связь.

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

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

Поначалу определение немного запутанное, но давайте пройдемся по нему. По аналогии с нашей проблемой, приведенной выше, пульт дистанционного управления является клиентом, а стереосистема, освещение и т. Д. Являются приемниками. В шаблоне команд есть объект Command, который инкапсулирует запрос , связывая вместе набор действий для конкретного получателя. Это достигается путем предоставления только одного метода execute (), который вызывает некоторые действия для получателя.

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

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

Ниже приведена реализация Java вышеупомянутого примера удаленного управления:

// Простая Java-программа для демонстрации
// реализация шаблона команд с использованием
// пример дистанционного управления.

  
// Интерфейс для команды

interface Command

{

    public void execute();

}

  
// Легкий класс и соответствующая ему команда
// классы

class Light

{

    public void on()

    {

        System.out.println("Light is on");

    }

    public void off()

    {

        System.out.println("Light is off");

    }

}

class LightOnCommand implements Command

{

    Light light;

  

    // Конструктор прошел свет

    // собирается контролировать.

    public LightOnCommand(Light light)

    {

       this.light = light;

    }

    public void execute()

    {

       light.on();

    }

}

class LightOffCommand implements Command

{

    Light light;

    public LightOffCommand(Light light)

    {

        this.light = light;

    }

    public void execute()

    {

         light.off();

    }

}

  
// Стерео и его командные классы

class Stereo

{

    public void on()

    {

        System.out.println("Stereo is on");

    }

    public void off()

    {

        System.out.println("Stereo is off");

    }

    public void setCD()

    {

        System.out.println("Stereo is set " +

                           "for CD input");

    }

    public void setDVD()

    {

        System.out.println("Stereo is set"+

                         " for DVD input");

    }

    public void setRadio()

    {

        System.out.println("Stereo is set" +

                           " for Radio");

    }

    public void setVolume(int volume)

    {

       // код для установки громкости

       System.out.println("Stereo volume set"

                          + " to " + volume);

    }

}

class StereoOffCommand implements Command

{

    Stereo stereo;

    public StereoOffCommand(Stereo stereo)

    {

        this.stereo = stereo;

    }

    public void execute()

    {

       stereo.off();

    }

}

class StereoOnWithCDCommand implements Command

{

     Stereo stereo;

     public StereoOnWithCDCommand(Stereo stereo)

     {

         this.stereo = stereo;

     }

     public void execute()

     {

         stereo.on();

         stereo.setCD();

         stereo.setVolume(11);

     }

}

  
// Простое дистанционное управление с одной кнопкой

class SimpleRemoteControl

{

    Command slot;  // только одна кнопка

  

    public SimpleRemoteControl()

    {

    }

  

    public void setCommand(Command command)

    {

        // установить команду удалённой воли

        // выполнить

        slot = command;

    }

  

    public void buttonWasPressed()

    {

        slot.execute();

    }

}

  
// Класс водителя

class RemoteControlTest

{

    public static void main(String[] args)

    {

        SimpleRemoteControl remote =

                  new SimpleRemoteControl();

        Light light = new Light();

        Stereo stereo = new Stereo();

  

        // мы можем динамически менять команду

        remote.setCommand(new

                    LightOnCommand(light));

        remote.buttonWasPressed();

        remote.setCommand(new

                StereoOnWithCDCommand(stereo));

        remote.buttonWasPressed();

        remote.setCommand(new

                   StereoOffCommand(stereo));

        remote.buttonWasPressed();

     }

  }

Выход:

Light is on
Stereo is on
Stereo is set for CD input
Stereo volume set to 11
Stereo is off

Обратите внимание, что пульт дистанционного управления ничего не знает о включении стерео. Эта информация содержится в отдельном объекте команды. Это уменьшает связь между ними.

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

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

Недостатки:

  • Увеличение количества классов для каждой отдельной команды

Ссылки:

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

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

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

Шаблон команды

0.00 (0%) 0 votes