在这个例子中,我们将使用 ICommand 和 AbstractCommand 来创建一个具体的命令类,这个命令类将用于处理游戏中的玩家得分更新。这个命令将负责接收一个分数值,更新 ScoreModel 中的分数,并可能触发其他系统的响应。
首先,定义一个具体的命令类 UpdateScoreCommand,它继承自 AbstractCommand 并实现必要的抽象方法 OnExecute。
public class UpdateScoreCommand : AbstractCommand
{
private int scoreToAdd;
public UpdateScoreCommand(int score)
{
scoreToAdd = score;
}
// 执行命令的具体逻辑
protected override void OnExecute()
{
// 获取ScoreModel实例
var scoreModel = GetArchitecture().GetModel<ScoreModel>();
if (scoreModel != null)
{
// 更新分数
scoreModel.Score += scoreToAdd;
Console.WriteLine("Score updated to: " + scoreModel.Score);
}
}
}
class Program
{
static void Main(string[] args)
{
// 初始化架构和模型
var architecture = GameArchitecture.Interface;
architecture.RegisterModel(new ScoreModel());
var scoreModel = architecture.GetModel<ScoreModel>();
scoreModel.Init();
// 注册分数改变事件
architecture.RegisterEvent<ScoreChangedEvent>(e => Console.WriteLine("Score changed to: " + e.NewScore));
// 创建并执行命令
var updateScoreCommand = new UpdateScoreCommand(10);
architecture.SendCommand(updateScoreCommand);
// 再次更新分数
updateScoreCommand = new UpdateScoreCommand(5);
architecture.SendCommand(updateScoreCommand);
// 清理
scoreModel.Deinit();
}
}
在这个例子中,UpdateScoreCommand 负责接收一个分数值,并将其添加到当前的分数中。这种命令的使用使得游戏逻辑更加模块化和可维护,同时也方便了单元测试和功能扩展。通过命令模式,我们可以将请求或简单操作封装为一个对象,从而使得用户可以使用不同的请求、队列或日志来参数化其他对象,同时支持撤销操作。