定義:カプセル化オブジェクトとして要求するので、あなたは、クライアントのパラメータの異なる要求を使用することを、要求キューまたはログ要求、およびアンドゥコマンドの回復を提供することができます。
タイプ:クラス行動パターン
クラス図:
コマンドモードの構造
名前が示すように、それはコマンド・モード・コマンドパッケージ、コマンドモードクラス図の基本的な構造を初めて目にあります:
- Commandクラス:コマンドを実行するために使用される一般的な方法を発表する抽象クラス、宣言するために実行するコマンドのクラスが、あります。
- ConcreteCommandクラス:コマンドクラスの実装クラス、クラスで宣言抽象メソッドが実現されます。
- クライアントクラス:最終クライアントは、クラスを呼び出します。
アクションのこれらの3つのカテゴリが焦点の発動クラスとRecevierクラスについての話を聞かせて、理解することは比較的簡単なはずです。
- 呼び出し元のクラス:呼び出し側がコマンドを呼び出すための責任があります。
- クラス受信機:受信者がコマンドを受信し、コマンドを実行する責任があります。
コマンドのいわゆるパッケージには、はっきり、何もより多くの一連の操作よりも方法を書いていないし、クラス図に反映ライン、上のクライアント・コールのために、一つだけConcreteCommandクラスとClientクラスは、コマンドに完了することができますパッケージは、さらに、柔軟性を高めるためには、あなたが適切なコマンド抽象クラスを追加することができ、最終的には、発信者と受信機は何ですか?
実際には、別の角度について考えることができます:あなたは、単にそれがパターン呼び出すことができるか、他の人を呼び出すためのコマンドとしていくつかの操作をカプセル化した場合は?行動クラス、柔軟性を向上させるために低結合、低カップリングを行うことが第一のモードとコマンドモード、発呼者と二つの役割の目的の受信者を追加するときは、この目的のために正確です。次のように共通のコードコマンドモードは次のとおりです。
class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
}
abstract class Command {
public abstract void execute();
}
class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute() {
this.receiver.doSomething();
}
}
class Receiver {
public void doSomething(){
System.out.println("接受者-业务逻辑处理");
}
}
public class Client {
public static void main(String[] args){
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
//客户端直接执行具体命令方式(此方式与类图相符)
command.execute();
//客户端通过调用者来执行命令
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}
}
私たちは、私たちが呼び出されたときに、最初のクラスの実装のタイミングは、呼び出し側は、コマンドクラス、そして最後に受信者のクラスで、コードを見ることができます。コマンドの実行が3つの段階に分けて、それがより良い、すべてのカップリングの操作がはるかに低いことをクラスにカプセル化されるよりもだし、これはコマンドモードの本質である:コマンドの呼び出し元や俳優は別にので、彼らは他の動作を気にしないこと。
コマンドモードの長所と短所
まず、良いencapsulationコマンドモード:各コマンドは、具体的にどのようにコマンドの実行を知らなくても、適切なコマンドを呼び出す行く必要性をどの機能、クライアントのために、カプセル化されています。たとえば、コマンドファイル操作のセットがあります:、新しいファイルを作成したファイル、削除ファイルをコピーします。これらの3つの操作は、コマンドクラスにカプセル化されている場合、クライアントは三つのクラスがあることを知っている必要があるために、コマンド、クラスカプセル化されたコマンドロジックとして、クライアントが知っている必要はありません。
第二に、良いスケーラビリティ、コマンドモードは、コマンドモードでは、受信者が操作基本パッケージ一般クラス、コマンドクラスは、さらに、これらの基本的な操作によって、新しいコマンドを追加する時にカプセル化されています、ゼロから始めるされていない一般的には、コマンドクラスを記述するために、コールへの受信者に利用可能なクラスの多くがあり、コードの再利用性の良いと呼ばれる利用可能なコマンドクラスがたくさんあります。例えば、ファイル操作は、我々はあなたが非常に便利なライン、上のファイルとの両方のコマンドの削除ファイルの組み合わせをコピーする必要があり、切断されたコマンドファイルを追加する必要があります。
最後に、コマンドの多くは、頭痛を開発することが必要であるならば、あるコマンドモード、中欠点について話しています。特に、多くの単純なコマンドでは、コードの行数のものに実装して、コマンドモードを使用するには、より簡単なコマンドよりも、あなたがカプセル化するコマンドクラスを記述する必要は制御されません。
該当するシーンコマンドモード
要求のほとんど - コマンドモードと言うで定義された応答モード機能、使用コマンドモードに適し、コマンドログモードは、アンドゥ操作がより便利な機能を実現しました。
概要
パターンのない最終的には機会のために、これはすべての開発者にとって非常にもつれた問題です。時には、のためには、いくつかの変更は、システムの柔軟性と拡張性のための要求に応じて発生し、いくつかのデザインパターンを使用すると予想、予見可能なニーズは、逆に、来るneed'dを予見しなかったことが起こるん、変更されたコードで、その結果、多くのデザインパターンを使用するが、逆の効果を果たしたので、全体のプロジェクトチーム訴えています。このような例は、私はすべてのプログラマが直面していると信じています。したがって、アジャイル開発の原則に基づいて、我々はパターンを使用せずに、現在のニーズに応じて、プログラムを設計していたことは良い解決策になることができますが、デザインパターンを紹介したいと思いますので、我々は、それを導入していない難しいことではありませんあなたが本当に使用する必要があるときに我々は、このデザインパターンの導入をシステムで別の顔をしている可能性があります。
例えば、コマンドモードを取る、我々は、要求を開発した - 応答モード機能は、一般的に、我々は方法の操作に応じて、要求をパッケージ化し、非常に一般的である。この方法は、encapsulationコマンドを呼び出すことができますが、ありませんコマンドモード。あなたはコマンドモードを使用している場合、3つのクラスに分散し、もともと論理的に配置された2つの役割、の、受信者は発信者を導入する必要がある、ので、最終的に我々は、個別に考慮しなければなりません。このデザインパターンの高さに上昇するのでしょう、この価格を考慮しなければならないデザインはそれだけの価値があります。