設計模式-23種設計模式-行為型-命令模式
阿新 • • 發佈:2021-07-07
一、命令模式介紹
二、命令模式引入
需求:
UML類圖:
程式碼實現(Java):
//建立命令介面 public interface Command { //執行動作(操作) public void execute(); //撤銷動作(操作) public void undo(); }
public class LightReceiver { public void on() { System.out.println(" 電燈打開了.. "); } public void off() { System.out.println(" 電燈關閉了.. "); } }
public class LightOffCommand implements Command { // 聚合LightReceiver LightReceiver light; // 構造器 public LightOffCommand(LightReceiver light) { super(); this.light = light; } @Override public void execute() { // 呼叫接收者的方法 light.off(); } @Overridepublic void undo() { // 呼叫接收者的方法 light.on(); } }
public class LightOnCommand implements Command { //聚合LightReceiver LightReceiver light; //構造器 public LightOnCommand(LightReceiver light) { super(); this.light = light; } @Override public voidexecute() { //呼叫接收者的方法 light.on(); } @Override public void undo() { //呼叫接收者的方法 light.off(); } }
/** * 沒有任何命令,即空執行: 用於初始化每個按鈕, 當呼叫空命令時,物件什麼都不做 * 其實,這樣是一種設計模式, 可以省掉對空判斷 * @author Administrator * */ public class NoCommand implements Command { @Override public void execute() { } @Override public void undo() { } }
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(); } }