web-dev-qa-db-ja.com

戦略パターンとコマンドパターンの違い

Strategy patternCommand pattern の違いは何ですか? Javaの例も探しています。

59
Krishna

通常、コマンドパターンを使用してオブジェクトを実行する必要があるものから作成し、操作とその引数を取得して、ログに記録し、元に戻すために保持し、リモートサイトなど。システム内の特定のポイントを通過する多数の個別のCommandオブジェクトが存在する傾向があり、Commandオブジェクトは、要求された操作を記述するさまざまなパラメーターを保持します。

一方、Strategyパターンは、howを指定するために使用され、特定のアルゴリズムを提供するためにより大きなオブジェクトまたはメソッドにプラグインされます。ソートの戦略は、マージソート、挿入ソート、またはリストが最小サイズよりも大きい場合にマージソートのみを使用するなどのより複雑なものかもしれません。ストラテジーオブジェクトは、コマンドオブジェクトが存在することをめぐって、一種の大量シャッフルを受けることはめったにありません。代わりに、構成またはチューニングの目的で使用されることがよくあります。

両方のパターンは、コードと、場合によっては別のオブジェクトに含まれる元のクラスの個々の操作のパラメーターをファクタリングして、独立した可変性を提供します。違いは、実際に遭遇するユースケースと各パターンの背後にある意図にあります。

100
Jeffrey Hantin

言葉はすでに与えられています。具体的なコードの違いを次に示します。

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

}
45
BalusC

戦略-クイックソートまたはマージソート[アルゴリズムの変更]

コマンド-開くまたは閉じる[アクションの変更]

35
Fakrudeen

主な違いは、コマンドがオブジェクトに対して何らかのアクションを実行することです。オブジェクトの状態を変更する場合があります。

一方、Strategyはオブジェクトの処理方法を決定します。いくつかのビジネスロジックをカプセル化します。

5
asif malek

Strategyパターンは、特定の機能に対して複数の実装(アルゴリズム)があり、パラメータータイプに応じて実行時にアルゴリズムを変更する場合に役立ちます。

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は、このパターンの主要なコンポーネントです。

異なるReceiverはInvoker&Concrete Commandを通じて同じコマンドを実行しますが、Commandの実装はReceiverごとに異なります。

例えばTVおよびDVDPlayerに対して「オン」および「オフ」機能を実装する必要があります。ただし、TVとDVDPlayerでは、これらのコマンドの実装が異なります。

以下のコード例の投稿を見てください:

戦略パターンの実世界の例

コマンドデザインパターンを使用

3
Ravindra babu