コマンドモード(コマンド)----デザインモード
コマンドモードは、簡単に言うと、「コマンドアクションのリクエスター」と「コマンドアクションの実行者」を切り離し、リクエストを元に戻すことができるようにすることです。
コマンドモードは、人生のいたるところに見られます。
上司は、従業員に直接ではなく、秘書に注文を出します。注文の実行方法は、秘書に渡されて完了します。または、家電製品用のスイッチボタンが多数付いた多目的リモコンがあります。今回は、この1つのリモコンですべての電化製品を制御できます。特定の電化製品のスイッチは、直接関係していません...
記事ディレクトリ
コマンドモードとは何ですか?
コマンドパターン、ソフトウェア設計では、特定のオブジェクトにリクエストを送信する必要があることがよくありますが、リクエストの受信者が誰であるか、またはどの操作がリクエストされているかはわかりません。特定のリクエスト受信者を指定する場合にのみ、プログラムを実行する必要があります。 、コマンドモードを使用して設計できます。
コマンドモードを使用すると、要求の送信者と受信者は相互の結合を排除し、オブジェクト間の呼び出し関係をより柔軟にし、分離を実現できます。
コマンドモードでは、リクエストはオブジェクトとしてカプセル化されるため、さまざまなパラメータを使用してさまざまなリクエスト(つまり、コマンド)を表すことができ、コマンドモードは元に戻す操作もサポートします。
戸惑う友達もいるはずですが、実は私も最初はとても戸惑いました。具体的な多目的リモコンの実装プロセスを見てみましょう。
コマンドモードのいくつかのセクション
-
指示:
コマンドのインターフェースを定義し、実行方法を宣言します。
-
ConcreteCommand(次のデモでは、ライトとTVの切り替えアクションはすべて次のようになっています):
コマンドインターフェイスは、「仮想」実装であるオブジェクトを実装します。通常、レシーバーを保持し、レシーバーの関数を呼び出して、コマンドによって実行される操作を完了します。
-
レシーバー(LightRecever、TV Recever):
受信者、実際にコマンドを実行するオブジェクト。コマンドが必要とする対応する関数を実装できる限り、どのクラスもレシーバーになることができます。
通常、ConcreteCommandで集約されます。
-
呼び出し元(RemoteController):
コマンドオブジェクトは、通常はコマンドオブジェクトを保持し、多くのコマンドオブジェクトを保持できる要求を実行するために必要です。これは、クライアントが実際にコマンドをトリガーし、対応するアクションを実行するようにコマンドに要求する場所です。これは、コマンドオブジェクトのエントリを使用するのと同じです。
-
クライアント:
特定のコマンドオブジェクトを作成し、コマンドオブジェクトのレシーバーを設定します。これは従来の意味でのクライアントではなく、コマンドオブジェクトとレシーバーをアセンブルしていることに注意してください。実際にコマンドを使用するクライアントは呼び出し元からトリガーされるため、このクライアントをアセンブラーと呼ぶ方がよいでしょう。
コマンドパターンのクラス図
多目的リモコンケースの実現
コマンドインターフェース
package com.design_patterns.command;
//创建命令接口
public interface Command {
//执行动作(操作)
public void execute();
//撤销动作(操作)
public void undo();
}
実行クラスのLightOnCommandライト
package com.design_patterns.command;
public class LightOnCommand implements Command {
private LightReceiver lightReceiver;
//构造方法
public LightOnCommand(LightReceiver lightReceiver) {
this.lightReceiver = lightReceiver;
}
//聚合LightReceiver
@Override
public void execute() {
//调用接收者的方法
lightReceiver.on();
}
@Override
public void undo() {
//调用接收者的方法
lightReceiver.off();
}
}
LightOffCommandライトオフ実行クラス
package com.design_patterns.command;
public class LightOffCommand implements Command {
private LightReceiver lightReceiver;
//构造方法
public LightOffCommand(LightReceiver lightReceiver) {
this.lightReceiver = lightReceiver;
}
//执行关闭的方法
@Override
public void execute() {
this.lightReceiver.off();
}
//执行撤销命令
@Override
public void undo() {
this.lightReceiver.on();
}
}
TVOnCommandTVオープン実行クラス
package com.design_patterns.command;
public class TVOnCommand implements Command {
//聚合tv接收者
private TVReceiver tvReceiver;
//通过构造方法传递进来实际的tv接收者
public TVOnCommand(TVReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
//使接收者执行动作命令
this.tvReceiver.on();
}
@Override
public void undo() {
//撤回操作
this.tvReceiver.off();
}
}
NoCommand操作を初期化するために使用されるコマンドクラスはありません
package com.design_patterns.command;
/**
* 无任何命令,即空执行。
* 用于初始化每个按钮,当调用空命令时,对象什么都不做
* 其实,这样也是一种设计模式,可以省略对空命令的判断
*/
public class NoCommand implements Command {
@Override
public void execute() {
}
@Override
public void undo() {
}
}
TVOffCommandTVオフ実行クラス
package com.design_patterns.command;
public class TVOffCommand implements Command {
private TVReceiver tvReceiver;
public TVOffCommand(TVReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
this.tvReceiver.off();
}
@Override
public void undo() {
this.tvReceiver.on();
}
}
LightReceiverライトレシーバークラス
package com.design_patterns.command;
public class LightReceiver {
public void on(){
System.out.println("电灯打开了!");
}
public void off(){
System.out.println("电灯关闭了!");
}
}
TVReceiverTVレシーバークラス
package com.design_patterns.command;
public class TVReceiver {
public void on(){
System.out.println("电视TV打开了!");
}
public void off(){
System.out.println("电视TV关闭了!");
}
}
RemoteControllerが要求する呼び出し側の多目的リモートコントロールクラス
package com.design_patterns.command;
public class RemoteController {
//开 按钮的命令数组
Command[] onCommands;
Command[] offCommands;
//执行撤销的命令
Command undoCommand;
public RemoteController() {
onCommands = new Command[5];
offCommands = new Command[5];
for (int i = 0; i < 5; i++){
onCommands[i] = new NoCommand();
offCommands[i] = new NoCommand();
}
}
//为我们的按钮设置你所需要的命令
public void setCommand(int no, Command onCommand, Command offCommand){
onCommands[no] = onCommand;
offCommands[no] = offCommand;
}
//按下开的按钮
public void onButtonWasPushed(int no){
// 找到你按下的按钮,并调用对应的方法
onCommands[no].execute();
//记录这次的操作,用于撤销
undoCommand = onCommands[no];
}
//按下关的按钮
public void offButtonWasPushed(int no){
// 找到你按下的按钮,并调用对应的方法
offCommands[no].execute();
//记录这次的操作,用于撤销
undoCommand = offCommands[no];
}
//按下撤销按钮
public void undoButtonWasPush(){
//撤销上次的动作
undoCommand.undo();
}
}
クライアントクライアント
package com.design_patterns.command;
import javafx.scene.effect.Light;
public class Client {
public static void main(String[] args) {
//使用命令设计模式,完成通过遥控器,对电灯的操作
/**
* 创建电灯的对象(接收者)
*/
LightReceiver lightReceiver = new LightReceiver();
//创建电灯相关的开关命令
LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
//创建一个遥控器
RemoteController remoteController = new RemoteController();
//给我们的遥控器设置相关的命令,比如 no = 0 使电灯的开和关的操作
remoteController.setCommand(0,lightOnCommand,lightOffCommand);
System.out.println("----按下灯的开的按钮----");
remoteController.onButtonWasPushed(0);
System.out.println("----按下灯的关的按钮----");
remoteController.offButtonWasPushed(0);
System.out.println("----撤销的操作----");
remoteController.undoButtonWasPush();
/**
* 创建电视TV的对象(接收者)
*/
TVReceiver tvReceiver = new TVReceiver();
//创建电视TV相关的开关命令
TVOnCommand tvOnCommand = new TVOnCommand(tvReceiver);
TVOffCommand tvOffCommand = new TVOffCommand(tvReceiver);
//给我们的遥控器设置相关的命令,比如 no = 1 使用电视TV的开和关的操作
remoteController.setCommand(1,tvOnCommand,tvOffCommand);
System.out.println("----按下电视TV的开的按钮----");
remoteController.onButtonWasPushed(1);
System.out.println("----按下电视TV的关的按钮----");
remoteController.offButtonWasPushed(1);
System.out.println("----撤销的操作----");
remoteController.undoButtonWasPush();
}
}
運転結果
----按下灯的开的按钮----
电灯打开了!
----按下灯的关的按钮----
电灯关闭了!
----撤销的操作----
电灯打开了!
----按下电视TV的开的按钮----
电视TV打开了!
----按下电视TV的关的按钮----
电视TV关闭了!
----撤销的操作----
电视TV打开了!
要約する
コマンドモードの主な機能は、要求側と実行側の分離を実現することです。要求オブジェクトを使用して要求を受信し、実行側を呼び出して操作を実行します。同じコマンドモードでも元に戻すことが実現されます。アクションの操作。これにより、プログラムの堅牢性がさらに向上します。
さて、これはコマンドモードです。よくわからない場合は、下にコメントを残してください〜