前言:命令模式内容比较多,这里做了拆分
命令模式基础篇 :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