设计模式学习:命令模式

来源:互联网 发布:erlang python 编辑:程序博客网 时间:2024/05/22 00:53

命令模式实现了请求者和执行者之间的解耦,请求者无需知道执行者的相关细节,执行者也无需知道请求者的细节。

举个例子是最好理解的:
在动作游戏中,玩家通过按键实现相应的游戏行为,如WASD通常是控制角色的移动方向。但往往动作游戏为了让玩家可以更好地操作,都会给玩家提供键位更改的设计,已配合各自的按键习惯。如果将按键和行为写在if判断语句内,当玩家想要改变键位,或策划拍脑门想改键位,这就变得很难更改。

在实际的开发中,如果提供给玩家键位更改的设计,就要用到命令模式。在这里举个小例子。(Space键控制跳跃,Shift键控制快跑)

首先是命令接口,各个命令实现接口里的Excute方法,完成各自的逻辑。

//命令接口public interface ICommand {    void Excute();}

接下来是两个具体的命令,跳跃和快跑。

//跳跃相关的行为public class JumpCommand implements ICommand{   @Override   public void Excute()   {       System.out.println("Jump");   }}//快跑相关的行为public class RunCommand implements ICommand{    @Override    public void Excute()     {        System.out.println("Run");          }}

接下来是控制按键输入的接口,SetCommamd方法会获得一个Command类,它并没有指定是哪个Command,这就实现了请求和执行的分离,按下键位之后,我可以或得任何一个Command,想要更改键位的时候,只需改变SetCommand方法里的Command就可以实现键位功能的修改。

//按键输入的接口public interface InputCommand {  void ButtonClick();   void SetCommand(ICommand command);  //这里添加了一个撤销的操作  void Undo(ICommand command);}

有两个具体的按键类,一个Shift按键和一个Space按键。

//shift键的具体类public class ShiftInput implements InputCommand{    ICommand command;    @Override    public  void SetCommand(ICommand command)     {        this.command = command;    }    @Override    public void ButtonClick()     {        this.command.Excute();    }    @Override    public void Undo(ICommand command)    {        //执行撤销操作,假装stop是撤销操作的执行        //command.stop();        System.out.println("撤销了Shitf");    }}//Space键的具体类public class SpaceInput implements InputCommand{    ICommand command;    @Override    public  void SetCommand(ICommand command)     {        this.command = command;    }    @Override    public void ButtonClick()     {        this.command.Excute();    }    @Override    public void Undo(ICommand command)    {        //执行撤销操作,假装stop是撤销操作的执行        //command.stop();    }}

最后是input的Controller类,按下键位会生成一个相应键位的InputCommand类。

//控制按键输入的Controller,模拟按下相应的键,生成相应的InputCommandpublic class InputController{    public InputCommand GetInputCommand(String inputString)    {   //模拟按下了space键        if(inputString.equals("Space"))        {            return new SpaceInput();        }        if(inputString.equals("Shift"))        {            return new ShiftInput();        }        else         {            return null;            }    }}

测试:

    public static void main(String[] args)    {        InputCommand jumpInputCommand=new InputController().GetInputCommand("Space");        InputCommand runInputCommand=new InputController().GetInputCommand("Shift");        ICommand jumpCommand=new JumpCommand();        ICommand runCommand=new RunCommand();        jumpInputCommand.SetCommand(jumpCommand);        runInputCommand.SetCommand(runCommand);        jumpInputCommand.ButtonClick();        runInputCommand.ButtonClick();        runInputCommand.Undo(runCommand);    }

测试结果:
这里写图片描述

原创粉丝点击