Разница между образцом стратегии и образцом командования - PullRequest
58 голосов
/ 29 января 2011

В чем разница между шаблоном стратегии и шаблоном команды ? Я также ищу несколько примеров на Java.

Ответы [ 5 ]

99 голосов
/ 29 января 2011

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

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

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

43 голосов
/ 29 января 2011

Слова уже даны.Вот разница в конкретном коде.

public class ConcreteStrategy implements BaseStrategy {

    @Override
    public void execute(Object argument) {
        // Work with passed-in argument.
    }

}

public class ConcreteCommand implements BaseCommand {

    private Object argument;

    public ConcreteCommand(Object argument) {
        this.argument = argument;
    }

    @Override
    public void execute() {
        // Work with own state.
    }

}
35 голосов
/ 29 января 2011

Стратегия - Быстрая сортировка или Слияние [изменение алгоритма]

Команда - Открыть или Закрыть [изменение действия]

5 голосов
/ 05 октября 2015

Основное отличие состоит в том, что команда выполняет некоторые действия над объектом.Это может изменить состояние объекта.

Пока стратегия решает, как обработать объект.Он заключает в себе некоторую бизнес-логику.

3 голосов
/ 26 января 2016

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

Один хороший пример из HttpServlet код:

service() метод направит запрос пользователя в doGet () или doPost () или какой-либо другой метод в зависимости от типа метода.

protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
    {
    String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
        long lastModified = getLastModified(req);
        if (lastModified == -1) {
        // servlet doesn't support if-modified-since, no reason
        // to go through further expensive logic
        doGet(req, resp);
        } else {
        long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
        if (ifModifiedSince < (lastModified / 1000 * 1000)) {
            // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
            maybeSetLastModified(resp, lastModified);
            doGet(req, resp);
        } else {
            resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        }
        }

    } else if (method.equals(METHOD_HEAD)) {
        long lastModified = getLastModified(req);
        maybeSetLastModified(resp, lastModified);
        doHead(req, resp);

    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);

    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);   

    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);

    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req,resp);

    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req,resp);

    } else {
        //
        // Note that this means NO servlet supports whatever
        // method was requested, anywhere on this server.
        //

        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[1];
        errArgs[0] = method;
        errMsg = MessageFormat.format(errMsg, errArgs);

        resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    }
    }

Существенные особенности паттерна Стратегии

  1. Это поведенческий паттерн
  2. Он основан на делегировании
  3. Изменяет внутренности объекта, изменяя поведение метода
  4. Используется для переключения между семейством алгоритмов
  5. Изменяет поведение объекта во время выполнения

Команда используется для слабой связи между Invoker и Receiver. Command, ConcreteCommand, Receiver, Invoker и Client являются основными компонентами этого шаблона.

Различные Приемники будут выполнять одну и ту же Команду через Invoker & Concrete Command, но реализация Команды будет отличаться для каждого Приемника.

например. Вы должны реализовать функции «Вкл.» И «Выкл.» Для TV & DVDPlayer . Но TV и DVDPlayer будут иметь различную реализацию для этих команд.

Посмотрите на посты с примерами кода:

Пример шаблона стратегии в реальном мире

Использование шаблона проектирования команд

...