設計模式解密(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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM