
游戏设计模式与实现之:命令模式 与 周期任务
发布日期:2021-05-12 18:11:27
浏览次数:10
分类:精选文章
本文共 1810 字,大约阅读时间需要 6 分钟。
GoF 模式:命令模式(Command Pattern)
模式说明
在软件开发中,某些操作往往与特定对象紧密耦合,使得它们的执行和重置难以实现。此时,我们可以通过命令模式来解耦操作和执行场景,实现对请求的封装和管理。
命令模式的核心思想是:将请求封装为对象,使得客户端可以用不同参数化的方式发起请求,并配合列、记录、应对重复、撤销等功能执行请求操作。当不想让命令和执行强烈耦合在一起时,命令模式提供了一种灵活的解决方案。
示例案例:简单的任务系统
需求分析
在任务系统中,游戏角色可以接收多个任务,每个任务都需要一定时间自动完成。这个任务系统需要支持任务的添加、移除以及时间控制执行。
代码分析
我们需要一个抽象的命令接口,以及针对不同命令的具体实现。从代码上看,我们只需要实现 ICommand 接口,然后针对每种任务生成对应的命令类即可。
public abstract class ICommand { abstract void execute();}
任务命令实现
每个任务具体实现 ICommand 接口,例如下面是完成任务的命令实现:
public class TaskCommand implements ICommand { @Override void execute() { Console.WriteLine("完成任务"); }}
任务管理类实现
为了管理任务和命令的执行时间,我们需要一个 TaskManager 类,它需要监控命令的执行情况。以下是一个简单的实现:
public class TaskManager { private Listcommands = new LinkedList<>(); private float cd = 5.0f; private float currentCD; public TaskManager() { currentCD = cd; } public void addTaskCommand() { if (commands.size() < 3) { commands.add(new TaskCommand()); } } public void removeCommand() { if (!commands.isEmpty()) { commands.remove(0); // 从新计算cd currentCD = cd; // 根据剩余的命令数量调整 } } public void removeAllCommand() { commands.clear(); } public void update() { if (commands.isEmpty()) return; currentCD -= Time.deltaTime; if (currentCD <= 0) { // 执行第一个命令 ICommand firstCommand = commands.get(0); firstCommand.execute(); commands.remove(0); // 重新计时 currentCD = cd; } }}
模式优势
命令模式的强大之处在于,它使得命令和执行完全解耦。每个命令都是独立的对象,可以灵活地管理。通过命令列,可以实现对复杂操作的管理和控制,比如延迟执行、撤销操作等,这对于分布式系统和异步操作特别有用。
此外,命令模式还可以扩展新的命令类型,只需实现相应的命令接口即可。这种方式具有高复用性和可扩展性,适用于客户端-server架构或分布式系统。
总结来说,命令模式通过对请求的封装和管理,帮助我们实现了操作和执行场景的解耦,为软件架构的灵活性和可维护性提供了强有力的支持。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月16日 06时57分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
自学C++编程,掌握这三项技能就可以工作了
2019-03-10
限时免费 | UWA粉丝专享定制化福利:项目性能诊断一对一!
2019-03-10
限时免费 | 用正确的方式,三天搞定Mono堆内存泄漏!
2019-03-10
正大国际期货,新交易系统源代码与逸富有什么区别,详细讲解
2019-03-11
HTTP 常见状态码
2019-03-11
通过js来实现表单的提交
2019-03-11
ASCII码对照表
2019-03-11
Thymeleaf sec:authorize 标签不生效
2019-03-11
js回车键登录
2019-03-11
Iterable与Iterator
2019-03-11
API_Net官方代码之训练网络
2019-03-11
Python爬虫小白入门(十五)Python常用模块大全
2019-03-11
Python机器学习(五十二)SciPy 基础功能
2019-03-11
自定义View实现SlidingMenu
2019-03-11
Python机器学习(六十五)Matplotlib 入门
2019-03-11
Toolbar设置标题的问题
2019-03-11
关于WebView当前地址问题的疑惑
2019-03-11
Python机器学习(九十二)Pandas 统计
2019-03-11
区块链入门到实战(21)之以太坊(Ethereum) – 分布式应用(DApp)
2019-03-11
区块链入门到实战(26)之以太坊(Ethereum) – 挖矿
2019-03-11