前言:命令模式内容比较多,这里做了拆分
命令模式基础篇 :https://blog.csdn.net/Json_wangqiang/article/details/85276179
命令模式扩展篇 - 宏命令:https://blog.csdn.net/Json_wangqiang/article/details/85276185
命令模式扩展篇 - 撤销命令:https://blog.csdn.net/Json_wangqiang/article/details/85276177
命令模式扩展篇 - 命令队列:https://blog.csdn.net/Json_wangqiang/article/details/85276186
命令模式扩展篇 - 请求日志:https://blog.csdn.net/Json_wangqiang/article/details/85276183
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:原文地址 https://blog.csdn.net/Json_wangqiang/article/details/85276185