设计模式解密(11)- 命令模式 - 扩展篇(宏命令)

前言:命令模式内容比较多,这里做了拆分

命令模式基础篇 :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

  

posted @ 2017-07-19 17:22  Json_wangqiang  阅读(2430)  评论(2编辑  收藏  举报