Strategy pattern と Command pattern の違いは何ですか? Javaの例も探しています。
通常、コマンドパターンを使用してオブジェクトを実行する必要があるものから作成し、操作とその引数を取得して、ログに記録し、元に戻すために保持し、リモートサイトなど。システム内の特定のポイントを通過する多数の個別のCommandオブジェクトが存在する傾向があり、Commandオブジェクトは、要求された操作を記述するさまざまなパラメーターを保持します。
一方、Strategyパターンは、howを指定するために使用され、特定のアルゴリズムを提供するためにより大きなオブジェクトまたはメソッドにプラグインされます。ソートの戦略は、マージソート、挿入ソート、またはリストが最小サイズよりも大きい場合にマージソートのみを使用するなどのより複雑なものかもしれません。ストラテジーオブジェクトは、コマンドオブジェクトが存在することをめぐって、一種の大量シャッフルを受けることはめったにありません。代わりに、構成またはチューニングの目的で使用されることがよくあります。
両方のパターンは、コードと、場合によっては別のオブジェクトに含まれる元のクラスの個々の操作のパラメーターをファクタリングして、独立した可変性を提供します。違いは、実際に遭遇するユースケースと各パターンの背後にある意図にあります。
言葉はすでに与えられています。具体的なコードの違いを次に示します。
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.
}
}
戦略-クイックソートまたはマージソート[アルゴリズムの変更]
コマンド-開くまたは閉じる[アクションの変更]
主な違いは、コマンドがオブジェクトに対して何らかのアクションを実行することです。オブジェクトの状態を変更する場合があります。
一方、Strategyはオブジェクトの処理方法を決定します。いくつかのビジネスロジックをカプセル化します。
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);
}
}
戦略パターンの顕著な特徴
Commandパターンは、InvokerとReceiver間の疎結合を有効にするために使用されます。 Command、ConcreteCommand、Receiver、Invoker、およびClientは、このパターンの主要なコンポーネントです。
異なるReceiverはInvoker&Concrete Commandを通じて同じコマンドを実行しますが、Commandの実装はReceiverごとに異なります。
例えばTVおよびDVDPlayerに対して「オン」および「オフ」機能を実装する必要があります。ただし、TVとDVDPlayerでは、これらのコマンドの実装が異なります。
以下のコード例の投稿を見てください: