zoukankan      html  css  js  c++  java
  • 设计模式解密(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

      

  • 相关阅读:
    用Processon在线绘制UML的尝试
    软工UML学习札记
    结对项目:计算器 第三篇
    结对项目:计算器 第二篇
    TXT四则运算计算器 后日谈
    TXT四则运算计算器
    软件工程作业 四则运算(一)
    敏捷开发
    如何做“足够好”的软件
    关于如何衡量个人在各自团队的效率和绩效
  • 原文地址:https://www.cnblogs.com/JsonShare/p/7206395.html
Copyright © 2011-2022 走看看