[原创]设计方式之命令模式详解

[原创]设计模式之命令模式详解
设计模式现如今已经被程序员越来越重视一个好的软件设计和设计模式息息相关,一个理想的模式的应用会使程序在可阅

读性上和扩展性上将大大提升,可以为后期的维护和扩展带来很大的便利,小弟在这里简单介绍设计模式只是想通过自己

所浅显的理解用自己的简单的语言表达出来让更多的初学者理解和使用上设计模式!


命令模式之命令模式,故名思意 命令模式 命令就是这个模式的关键之处,先来了解下现实中的命令 现实中命令也无处不

在.命令模式是关于处理一个对象请求另一个对象调用其方法去完成某一项任务!

举例说明:

士兵军训,教官对士兵下命令 跑步走,起步走,向左转 这就是一个命令,这其中士兵 就是命令的接受者,而跑步走 齐步

走 是一个明确的命令,教官此时是请求者 此处我们叫命令发起者! 这段语言描述其实就已经描述了一个明确的命令模

式!
               命令请求者        命令执行者       具体命令
                                   
                  教官----------->士兵-------->向左转

在这里教官面对士兵时不需要和一个一个的士兵去打交道 让他们向左转,他只需要下命令向左转,士兵就会执行命令去向

左转!命令模式的核心就是使用命令对象来封装方法调用,就是在这里将教官的命令和士兵执行命令封装成一个命令对象

这样当教官下了某种命令的时候 教官只需要和命令打交道 教官只需要喊出 跑步走 士兵就会集体跑步走!

下面给出刚才所说的案例的具体Java代码的实现:

/**
*  接受者实现方法
*  士兵的动作实现类,跑步走,齐步走,向左转
*/
public class SoldierAction{
    
    //士兵跑步走的具体实现
    public void SoldierRun(){
        
          System.out.println("士兵跑步走");
    }
    
    //士兵齐步走的具体实现
    public void SoldierQuickStep(){
        
           System.out.println("士兵齐步走");

    }

    //士兵向左转的实现
     public void SoldierTurnLeft(){

           System.out.println("士兵向左转");

    }
} 


/**
*  这时候我们来创建教官命令接口
* 
*/
public interface MasterCommand{
     
     //一个执行命令的方法
     public void executeCommand();
}


/**
*  这时候我们来创建教官命令接口的实现类
*  士兵跑步走命令的实现
*/
public class SoldierRunCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierRun();
    }
}


/**
*  这时候我们来创建教官命令接口的实现类
*  士兵齐步走命令的实现
*/
public class SoldierQuickStepCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierQuickStep();
    }
}



/**
*  这时候我们来创建教官命令接口的实现类
*  士兵向左转命令的实现
*/
public class SoldierTrunLeftCommand implements MasterCommand{
     
    private SoldierAction soldierCommand;
    
    public SoldierRunCommand(SoldierAction inputSoldierAction){
        
         this.soldierCommand=inputSoldierAction;
    }
     //一个执行命令的方法
     public void executeCommand(){
         
          soldierCommand.SoldierTurnLeft();
    }
}


/**
*  这时候我们来创建教官请求的实现类
*  教官在这里发出命令
*/
public class MasterPublishCommand{
     
    private MasterCommand masterCommand;
    
    public void setMasterCommand(MasterCommand inputCommand){
        
         this.mMasterCommand=inputCommand;
    }
     //一个执行命令的方法
     public void publishCommand(){
         
          masterCommand.executeCommand();
    }
}


好了,此时我们的请求者已经创建完成,我们的具体命令 和 接受者都已经完成创建 此时我们就要进行训练了

 public class TrainTroops{

     public static void main(Stirng[]args){
         
         //首先我们来创建命令接受者
         SoldierAction sa=new SoldierAction();

         //创建一条跑步的命令
          MasterCommand runCommand=new SoldierRunCommand();
         
         //创建一条齐步走的命令
          MasterCommand stepCommand=new SoldierQuickStepCommand();
        
         //创建一个向左转的命令
          MasterCommand turnLeftCommand=new SoldierTurnLeftCommand();

         //然后我们来创建一个教官
          MasterPublishCommand master=new MasterPublishCommand();

        //此时教官发布一条跑步的命令
         master.setMasterCommand(runCommand);

        master.publishCommand();

        //此时教官发布一条齐步走的命令
         master.setMasterCommand(stepCommand);

        master.publishCommand();

        //此时教官发布一条向左转的命令
         master.setMasterCommand(turnLeftCommand);

        master.publishCommand();
     }
 }


整个代码我们就完成了一个命令模式的实现,当然了例子很简单,此处我们的代码中教官这个命令发布者的角色不需要和

任何的接受者去打交道,他只需要知道自己要下什么命令就是此处的master.setMasterCommand(stepCommand)

然后把命令发布出去就可以了master.publishCommand(),教官这个命令请求的角色中不包含任何接受者的示例引用

因此彻底的消除了命令发布者 和 接受者之间的耦合!如果此时需要增加新的命令或者是新的命令接受者的话,不需要修

改调用类的代码,调用者就可以使用新的命令对象,反过来如果增加了新的调用者,不需要修改现有的命令和命令接受者

新增加的调用者就可以直接使用已有的具体命令了!

本人不敢说理解的很透彻了,只是想通过自己的理解用最简单的话语表现出来对设计模式的理解,目的是希望能用比较好

理解的一种方式让大家去理解和学习设计模式,希望广大大牛新手来拍砖,如有错误和其他独特见解的可以指出大家互相

交流进步,如果效果好的话会考虑为广大网友连载,本人属于自己原创,完全是自己的见解,转载请标明出处!谢谢