头歌-设计模式:Java命令模式实验
任务描述
在植物大战僵尸的游戏设计中,植物战士是兵营生产的,玩家通过点击界面上“图片按钮”向兵营发出生产命令,兵营接受命令后每生产一个植物战士需要冷却一定的时间才能继续生产。
本关任务:本模拟程序中只需要实现一种植物战士的生产,请你用命令模式实现。
实现方式
声明仅有一个执行方法的命令接口;
抽取请求并使之成为实现命令接口的具体命令类。 每个类都必须有一组成员变量来保存请求参数和对于实际接收者对象的引用。 所有这些变量的数值都必须通过命令构造函数进行初始化;
找到担任发送者职责的类。 在这些类中添加保存命令的成员变量。 发送者只能通过命令接口与其命令进行交互。 发送者自身通常并不创建命令对象, 而是通过客户端代码获取;
修改发送者使其执行命令, 而非直接将请求发送给接收者;
客户端必须按照以下顺序来初始化对象:
创建接收者;
创建命令, 如有需要可将其关联至接收者;
创建发送者并将其与特定命令关联。
编程要求
根据提示,在右侧编辑器 Begin-End 内补充 “CampInvokers.java”和 “ProduceCommand.java” 文件代码,其它地方不要修改。
测试说明
平台会对你编写的代码进行测试,请输入发出生产命令的个数和兵营冷却时间(毫秒)。
输入结束后,为了模拟界面操作,系统会在 1000 毫秒内持续监控兵营接到的命令。
测试输入:6 200
预期输出:
豌豆射手生产出来了
豌豆射手生产出来了
豌豆射手生产出来了
豌豆射手生产出来了
豌豆射手生产出来了
测试输入:6 500
预期输出:
豌豆射手生产出来了
豌豆射手生产出来了
答案:
ProduceCommand.java
package step1; public class ProduceCommand extends Commands{ @Override public void Execute() { /********** Begin *********/ // 直接创建植物战士 new Peashooter(); /********** End *********/ } }CampInvokers.java
package step1; import java.util.ArrayList; import java.util.List; public class CampInvokers { private final List<Commands> commands = new ArrayList<>();//命令队列 private final long TrainTimer;//训练冷却时间 private long timer;//当前时间 public CampInvokers(long trainTime){ TrainTimer = trainTime; timer = System.currentTimeMillis() - trainTime; // 确保第一个命令可以立即执行 } public void Train() { /********** Begin *********/ // 将生产命令加入到命令队列 commands.add(new ProduceCommand()); /********** End *********/ } public void ExecuteCommand() { if (commands.size() <= 0) return; if (timer + TrainTimer <= System.currentTimeMillis()) { /********** Begin *********/ // 执行队列里最上面的命令 Commands cmd = commands.get(0); cmd.Execute(); // 移除最上面的命令 commands.remove(0); // 重置冷却时间 timer = System.currentTimeMillis(); /********** End *********/ } } public void CancelTrainCommand() { if (commands.size() > 0) { commands.remove(commands.size() - 1); if (commands.size() == 0) { timer = System.currentTimeMillis(); } } } }