Різниця між шаблоном стратегії та шаблоном команд


79

У чому різниця між шаблоном стратегії та шаблоном команд ? Я також шукаю кілька прикладів на Java.


перший пошуковий запит: coderanch.com/t/100214/patterns/Command-vs-Strategy-Pattern
Mitch Wheat


Відповіді:


121

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

З іншого боку, шаблон Стратегії використовується, щоб вказати, як щось робити, і підключається до більшого об'єкта або методу, щоб забезпечити певний алгоритм. Стратегія сортування може бути сортуванням злиттям, сортуванням вставки або, можливо, чимось більш складним, наприклад, лише використанням злиття сортування, якщо список більший за якийсь мінімальний розмір. Об'єкти стратегії рідко піддаються такому масовому перемішуванню, як об'єкти Command, замість цього часто використовуються для конфігурації або налаштування.

Обидва візерунки передбачають факторизацію коду та, можливо, параметрів для окремих операцій із вихідного класу, що містив їх, в інший об’єкт, щоб забезпечити незалежну мінливість. Відмінності полягають у випадках використання, які зустрічаються на практиці, та намірах, що лежать в основі кожного зразка.


29
Коротко кажучи, команда має інше призначення. Наприклад: CutCommand, DeleteCommand, CopyCommand, SortCommand, .... Стратегія має ту саму мету, але інший підхід. В алгоритмі сортування ми маємо: BubbleSort, SelectionSort, ...
Hien Nguyen

61

Слова вже подані. Ось різниця у конкретному коді.

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

}

46

Стратегія - швидкий сорт або злиття [зміна альго]

Команда - Відкрити або закрити [зміна дії]


9

Головна відмінність полягає в тому, що команда виконує певні дії над об'єктом. Це може змінити стан об'єкта.

Поки Стратегія вирішує, як обробити об'єкт. Він містить певну ділову логіку.


4

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

Один хороший приклад з коду 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 і приймачем. Command, ConcreteCommand, Receiver, Invoker і Client є основними компонентами цього шаблону.

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

Наприклад, для телевізора та програвача DVDPlayer потрібно застосувати функцію "Увімкнути" та "Вимкнути" . Але TV і DVDPlayer матимуть різну реалізацію цих команд.

Погляньте на повідомлення нижче з прикладами коду:

Приклад реального світу шаблону стратегії

Використання командного дизайну


0

Я думаю, що велика різниця тут полягає в тому, що шаблон стратегії використовується, коли вам потрібно перетасувати між різними об'єктами, що реалізують один і той же інтерфейс , але шаблон команди використовується для перетасовки між деякими об'єктами, що реалізують різні інтерфейси (оскільки він інкапсулює їх в інші об'єкти, звані " Командні об'єкти ") і передайте ці командні об'єкти так само, як це робить шаблон стратегії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.