设计模式学习:命令模式
来源:互联网 发布: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); }
测试结果:
阅读全文
0 0
- 设计模式学习--命令模式
- 设计模式学习-----命令模式
- 设计模式学习--命令模式
- 设计模式学习--命令模式
- 学习设计模式-命令模式
- 设计模式学习:命令模式
- 设计模式学习10 -- 命令模式
- 设计模式学习笔记之命令模式
- 设计模式学习--命令模式(command)
- <大话设计模式学习一>命令模式
- 设计模式学习总结(18) 命令模式
- 设计模式学习笔记之命令模式
- 设计模式学习笔记-命令模式
- 设计模式学习笔记--命令模式
- [设计模式学习笔记]命令模式
- 设计模式学习笔记—命令模式
- 学习笔记:Java设计模式-命令模式
- 学习笔记:java设计模式--命令模式
- Delphi6在win10中以管理员权限打开后报 C:\Program Files (x86)\Borland\Delphi6\Projects\Bpl\xxx.bpl找不到
- Master的注册机制和状态管理详解
- Android图像处理_积木效果md
- web.xml中<security-constraint>和四种认证类型
- 链表的实现
- 设计模式学习:命令模式
- typedef定义函数指针
- 【数据结构】中缀表达式求值
- mysql 开启远程
- 同一个jsp页面实现增删改查,查询时遇到困难以及定时器遇到的情况
- 数据库(二)
- php各版本下载
- JAVA内存区域与内存溢出相关设置
- [Zeppelin]设置访问登录权限