游戏设计模式与实现之:命令模式 与 周期任务
发布日期: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 List
commands = 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秒