ストラテジーパターンとコマンドパターンの違いは何ですか?また、Javaでいくつかの例を探しています。
6 に答える
通常、コマンド パターンは、実行する必要があるオブジェクトを作成するために使用されます。つまり、操作とその引数を取得し、それらをオブジェクトにラップして、ログに記録したり、元に戻すために保持したり、リモート サイトに送信したりします。時間の経過とともにシステム内の特定のポイントを通過する多数の個別の Command オブジェクトになる傾向があり、Command オブジェクトは要求された操作を説明するさまざまなパラメーターを保持します。
一方、戦略パターンは、何かを実行する方法を指定するために使用され、より大きなオブジェクトまたはメソッドにプラグインして特定のアルゴリズムを提供します。並べ替えの戦略は、マージ並べ替え、挿入並べ替え、またはリストが最小サイズよりも大きい場合にのみマージ並べ替えを使用するなどのより複雑なものである可能性があります。ストラテジー オブジェクトは、そのコマンド オブジェクトに関する大量シャッフルの対象となることはめったになく、代わりに構成や調整の目的で使用されることがよくあります。
どちらのパターンも、独立した可変性を提供するために、それらを含む元のクラスから別のオブジェクトにコードと、場合によっては個々の操作のパラメーターを分解する必要があります。違いは、実際に遭遇するユースケースと、各パターンの背後にある意図にあります。
言葉はすでに与えられています。具体的なコードの違いは次のとおりです。
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.
}
}
戦略 - クイックソートまたはマージソート [アルゴリズム変更]
コマンド - 開くまたは閉じる [アクション変更]
The main difference is , the command does some action over the object. It may change the state of an object.
While Strategy decides how to process the object. It encapsulates some business logic.
戦略パターンは、特定の機能に対して複数の実装 (アルゴリズム) があり、パラメーターの型に応じて実行時にアルゴリズムを変更したい場合に役立ちます。
HttpServletコードからの 1 つの良い例:
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);
}
}
ストラテジーパターンの特徴
- 行動パターンです
- それは委任に基づいています
- メソッドの動作を変更することにより、オブジェクトの内部を変更します
- アルゴリズムのファミリを切り替えるために使用されます
- 実行時のオブジェクトの動作を変更します
コマンドパターンは、Invoker と Receiver の間の疎結合を有効にするために使用されます。Command、ConcreteCommand、Receiver、Invoker、および Client は、このパターンの主要なコンポーネントです。
異なるレシーバーは、インボーカーと具象コマンドを介して同じコマンドを実行しますが、コマンドの実装はレシーバーごとに異なります。
例: TV & DVDPlayerの「オン」および「オフ」機能を実装する必要があります。ただし、TV と DVDPlayer では、これらのコマンドの実装が異なります。
コード例を含む以下の投稿をご覧ください。