技術共有

コマンドパターンとその応用を調べる

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

コマンドモード

コマンドモードは、リクエストを、リクエストに関連するすべての情報を含む別個のオブジェクトに変換する動作設計パターンです。 この変換により、さまざまなリクエストに基づいてメソッドをパラメータ化し、リクエストを遅延またはキューに入れたり、取り消し可能な操作を実装したりすることができます。

コマンドモードの構造

ここに画像の説明を挿入します

  1. 差出人 (送信者) - 「呼び出し者」とも呼ばれる - クラスはリクエストの初期化を担当します。リクエストには、コマンド オブジェクトへの参照を保存するためのメンバー変数が含まれている必要があります。送信者は、受信者にリクエストを直接送信せずにコマンドをトリガーします。送信者はコマンド オブジェクトの作成を担当しないことに注意してください。送信者は通常、コンストラクターを介してクライアントから事前に生成されたコマンドを取得します。
  2. 注文(コマンド) インターフェイスは通常、コマンドを実行するメソッドを宣言するだけです。
  3. 特定の注文 (具象コマンド) はさまざまな種類のリクエストを実装します。特定のコマンド自体は作業を完了しませんが、呼び出しをビジネス ロジック オブジェクトに委任します。ただし、コードを簡素化するために、これらのクラスをマージできます。オブジェクトの実行メソッドを受け取るために必要なパラメータは、特定のコマンドのメンバー変数として宣言できます。コマンド オブジェクトを不変にして、コンストラクターを介したこれらのメンバー変数の初期化のみを許可することができます。
  4. 受信機 (Receiver) クラスにはビジネス ロジックの一部が含まれます。ほとんどすべてのオブジェクトが受信機として機能します。ほとんどのコマンドは、リクエストを受信者に渡す方法の詳細のみを扱い、実際の作業は受信者自身が行います。
  5. クライアント (クライアント) は特定のコマンド オブジェクトを作成および構成します。クライアントは、受信側エンティティを含むすべてのリクエスト パラメーターをコマンドのコンストラクターに渡す必要があります。その後、生成されたコマンドを 1 つ以上の送信者に関連付けることができます。

コマンドモードの共通コード:

//抽象接收者
public abstract class Receiver{
	public abstract void operation();
}

//具体接收者
public class Recevier1 extends Recevier{
	public void operation(){
		...
	}
}

//通用命令接口
public interface Command{
	void execute();
}

//具体命令类
public class ConcreteCommand1 implements Command{
	private Receiver receiver;
	
	public ConcreteCommand1(Receiver _receiver){
		 this.receiver = _receiver;
	}
	
	public void execute(){
		this.receiver.operation();
	}
}

//调用者类
public class Invoker{
	private Command command;
	
	public void setCommand(Command _command){
		this.command = _command;
	}
	
	public void executeCommand(){
		this.command.execute();
	}
	
}

//主程序类
public class Client{
	public static void main(String[] args){
		//调用者
		Invoker invoker = new Invoker();
		//接收者
		Receiver receiver1 = new Receiver1();
		//定义一个命令
		Command command = new ConcreteCommand1(receiver1);
		
		invoker.setCommand(command);
		invoker.executeCommand();
	}
}