Разница между шаблоном стратегии и шаблоном команды

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


person Krishna    schedule 29.01.2011    source источник
comment
первое совпадение поиска: coderanch.com/t/100214/patterns/ Command-vs-Strategy-Pattern   -  person Mitch Wheat    schedule 29.01.2011
comment
Связано: stackoverflow.com/questions/1673841/   -  person BalusC    schedule 29.01.2011
comment
возможный дубликат шаблона стратегии и шаблона команды   -  person pramodc84    schedule 18.12.2014


Ответы (6)


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

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

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

person Jeffrey Hantin    schedule 29.01.2011
comment
Короче говоря, у команды другое предназначение. Например: CutCommand, DeleteCommand, CopyCommand, SortCommand, .... Стратегия имеет ту же цель, но другой подход. В алгоритме сортировки мы имеем: BubbleSort, SelectionSort, ... - person Hien Nguyen; 11.09.2017

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

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.
    }

}
person BalusC    schedule 29.01.2011

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

Command - Open или Close [изменение действия]

person Fakrudeen    schedule 29.01.2011
comment
Веб-службы SOAP являются одним из примеров шаблона команд. - person amarnath harish; 09.02.2021

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

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

person Asif Malek    schedule 05.10.2015

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

Один хороший пример из Код 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. Изменяет поведение объекта во время выполнения.

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

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

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

Взгляните на сообщения ниже с примерами кода:

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

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

person Ravindra babu    schedule 26.01.2016

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

person Ahmed Shalaby    schedule 21.11.2020