コマンドモード
まず、応用例
1)インテリジェント機器のセット、照明光、ファン、冷蔵庫、洗濯機
2)異なるメーカーからのこれらのアプライアンスは、我々は、家電製品は、各アプリのためにインストールされている、希望は全体のアプリを介して制御することができる必要はありません
3)その後、各家電メーカーはアプリコールに統一されたインタフェースを提供するために、すべての機器を制御するためのアプリを達成するために。次に、コマンド・モードの使用を検討することができます。
オブジェクト「アクションの行為者」から切り離す4)コマンドテンプレート「操作要求者」
5)の場合、アクション要求者は、家電製品のすべてのパフォーマーのメーカーの携帯電話のアプリです
第二に、コマンドモード
1.基本はじめに
- コマンドモードになり、互いの間の結合を排除するための要求の送信者と受信者の要求オブジェクト間のコールは、より柔軟で切り離されるように、。
- 平野理解:一般的には、それを行うには兵士に命令を出しました。
1)実行者:呼び出し側の役割(一般)
2)受信機:受信機の役割)を実装し、特定のエグゼキュータコマンド兵士要求(関連する動作を実行する方法を知っています
3)コマンド:コマンドの役割は、すべてのは、それがインタフェースまたは抽象クラス(接続将軍や兵士)することができ、ここに実行するコマンド
4)ConcreteCommand:結合作用にレシーバオブジェクトは、受信者は、対応する動作を実行達成コール
スマート家電の問題を解決するための第三に、コマンドモード
アイデアの1.分析
2.コードの実装
//抽象命令接口
public interface Command {
//执行动作(操作)
public void execute();
//撤销动作(操作)
public void undo();
}
// 具体命令
public class LightOffCommand implements Command {
// 聚合LightReceiver
LightReceiver light;
// 构造器
public LightOffCommand(LightReceiver light) {
super();
this.light = light;
}
@Override
public void execute() {
// 调用接收者的方法
light.off();
}
@Override
public void undo() {
// 调用接收者的方法
light.on();
}
}
public class LightOnCommand implements Command {
//聚合LightReceiver
LightReceiver light;
//构造器
public LightOnCommand(LightReceiver light) {
super();
this.light = light;
}
@Override
public void execute() {
//调用接收者的方法
light.on();
}
@Override
public void undo() {
//调用接收者的方法
light.off();
}
}
// 接收者
public class LightReceiver {
public void on() {
System.out.println(" 电灯打开了.. ");
}
public void off() {
System.out.println(" 电灯关闭了.. ");
}
}
//遥控(命令者)
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) { // no 0
// 找到你按下的开的按钮, 并调用对应方法
onCommands[no].execute();
// 记录这次的操作,用于撤销
undoCommand = onCommands[no];
}
// 按下关按钮
public void offButtonWasPushed(int no) { // no 0
// 找到你按下的关的按钮, 并调用对应方法
offCommands[no].execute();
// 记录这次的操作,用于撤销
undoCommand = offCommands[no];
}
// 按下撤销按钮
public void undoButtonWasPushed() {
undoCommand.undo();
}
}
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.undoButtonWasPushed();
}
}
第四に、コマンドモードの注意事項
1)オブジェクトは、開始要求の実行オブジェクトから分離されます。呼び出し側は、呼び出し側は単に誰特定の受信者はい知らなくても、execute()メソッドによって開始されたオブジェクトの要求が受信者が作業できるようにすることができますコマンドオブジェクトを呼び出します。
2)キューにCommandオブジェクト限り、コマンドキューを設計するのは簡単、あなたができるマルチスレッド実行コマンド
3)簡単取り消しとやり直しの要求を実現するために
4)コマンド不十分モード:システムが過剰コンクリートコマンドクラスを引き起こすことは、システムの複雑さを増大させます。
5)空軍は、私たちはオペアンプを判断する必要がなくなり、デザインパターンです。
6)コマンドモード古典的なシナリオ:ボタンインタフェースはコマンドモードCMD(DOSコマンド)注文は、フィードバック機構をトリガ/リドゥを取り消すあります