前言:命令模式內容比較多,這里做了拆分
命令模式基礎篇 :http://www.cnblogs.com/JsonShare/p/7202133.html
命令模式擴展篇 - 宏命令:http://www.cnblogs.com/JsonShare/p/7206395.html
命令模式擴展篇 - 撤銷命令:http://www.cnblogs.com/JsonShare/p/7206513.html
命令模式擴展篇 - 命令隊列:http://www.cnblogs.com/JsonShare/p/7206607.html
命令模式擴展篇 - 請求日志:http://www.cnblogs.com/JsonShare/p/7206665.html
1、宏命令
什么是宏命令呢?簡單點說就是包含多個命令的命令,是一個命令的組合;
宏命令又稱為組合命令,它是命令模式和組合模式聯用的產物;
宏命令也是一個具體命令,不過它包含了對其他命令對象的引用,在調用宏命令的execute()方法時,將遞歸調用它所包含的每個成員命令的execute()方法,一個宏命令的成員對象可以是簡單命令,還可以繼續是宏命令。執行一個宏命令將執行多個具體命令,從而實現對命令的批處理。
我們可以定義“命令的命令”來實現(這種特殊的命令的execute方法內部是順序調用其它若干命令的execute方法)
這里模擬一下電腦開機,按下開機鍵后,主要經歷四個階段:
BIOS -> 主引導記錄(查詢那個分區是操作系統)-> 硬盤啟動 -> 操作系統
這里簡化成四個命令:BIOSStartCommand、MBRStartCommand、HDDStartCommand、OSStartCommand;
具體實例代碼:
package com.designpattern.Command.extend.MacroCommand; /** * 抽象命令角色類 * @author Json */ public interface Command { /** * 執行方法 */ void execute(); }
package com.designpattern.Command.extend.MacroCommand; /** * 宏命令接口 * @author Json */ public interface MacroCommand extends Command { /** * 宏命令的管理方法 * 添加命令 */ void addCommand(Command command); /** * 宏命令的管理方法 * 移除命令 */ void removeCommand(Command command); }
package com.designpattern.Command.extend.MacroCommand; import java.util.ArrayList; /** * 宏命令接口實現 * @author Json */ public class ComputerMacroCommand implements MacroCommand { private ArrayList<Command> commands; //無參構造方法 public ComputerMacroCommand(){ commands = new ArrayList<Command>(); } @Override public void addCommand(Command command){ commands.add(command); } @Override public void removeCommand(Command command){ commands.remove(command); } @Override public void execute(){ for (int i=0; i < commands.size(); i++){ commands.get(i).execute(); } } }
package com.designpattern.Command.extend.MacroCommand; /** * 接收者角色類 * @author Json */ public class Computer { public void startBIOS(){ System.out.println("BIOS啟動..."); } public void startMBR(){ System.out.println("MBR加載..."); } public void startHDD(){ System.out.println("HDD加載..."); } public void startOS(){ System.out.println("系統啟動..."); } }
package com.designpattern.Command.extend.MacroCommand; /** * 具體命令 -- BIOS啟動命令 * @author Json */ public class BIOSStartCommand implements Command { private Computer computer; public BIOSStartCommand(Computer computer){ this.computer = computer; } @Override public void execute() { computer.startBIOS(); } }
package com.designpattern.Command.extend.MacroCommand; /** * 具體命令 -- MBR啟動命令 * @author Json */ public class MBRStartCommand implements Command { private Computer computer; public MBRStartCommand(Computer computer){ this.computer = computer; } @Override public void execute() { computer.startMBR(); } }
package com.designpattern.Command.extend.MacroCommand; /** * 具體命令 -- HDD啟動命令 * @author Json */ public class HDDStartCommand implements Command { private Computer computer; public HDDStartCommand(Computer computer){ this.computer = computer; } @Override public void execute() { computer.startHDD(); } }
package com.designpattern.Command.extend.MacroCommand; /** * 具體命令 -- OS啟動命令 * @author Json */ public class OSStartCommand implements Command { private Computer computer; public OSStartCommand(Computer computer){ this.computer = computer; } @Override public void execute() { computer.startOS(); } }
下面測試一下:
package com.designpattern.Command.extend.MacroCommand; /** * 測試 * @author Json */ public class Client { public static void main(String[] args) { //創建接收者 Computer computer = new Computer(); //創建命令對象,設定它的接收者 Command bios_command = new BIOSStartCommand(computer); //創建命令對象,設定它的接收者 Command mbr_command = new MBRStartCommand(computer); //創建命令對象,設定它的接收者 Command hdd_command = new HDDStartCommand(computer); //創建命令對象,設定它的接收者 Command os_command = new OSStartCommand(computer); //命令控制對象Invoker,把命令對象通過構造方法設置進去 MacroCommand invoker = new ComputerMacroCommand(); invoker.addCommand(bios_command); invoker.addCommand(mbr_command); invoker.addCommand(hdd_command); invoker.addCommand(os_command); System.out.println("我要是用電腦,於是按下開機按鈕..."); invoker.execute(); System.out.println("現在可以使用電腦了!!!"); } }
結果:
我要是用電腦,於是按下開機按鈕...
BIOS啟動...
MBR加載...
HDD加載...
系統啟動...
現在可以使用電腦了!!!
以上就是命令模式中宏命令的使用。那么到這里相信大家都對宏命令有了初步的認識;
PS:源碼地址 https://github.com/JsonShare/DesignPattern/tree/master
PS:原文地址 http://www.cnblogs.com/JsonShare/p/7206395.html