GoF解释:
将请求封装成对象,让你可以将客户端的不同请求参数化,并配合对列、记录、复原等方法来执行请求的操作
模式说明:
当我们不希望命令和执行强烈的耦合在一起,需要操作某件事的时候,生成一个命令,然后将这个命令加入对列中,在一个恰当的时机去执行,并且可以存在撤销等操作。当我们不使用设计模式的时候,命令和操作时强烈的耦合在一起的,大多数情况下命令并不能清爽的执行下去,并且也会伴随一些难以撤销的问题。
案例分析:简单任务系统
1.需求分析:游戏角色可以接收任务,同时可以接很多个,但是每个都需要花费一定的时间自动完成。
2.代码分析:我们只需要一个抽象的Command接口,并针对不同的命令进行实现
实现ICommand
public abstract class ICommand{
//每个任务需要执行的地方
public abstract void Execute();
}
实现任务Command
public class TaskCommand : ICommand{
public override void Execute(){
Console.Write("完成任务");
}
}
实现任务的统一管理类TaskManager
public class TaskManager{
public float mCD = 5.0f;
public float mCurCD ;
public TaskManager(){
mCurCD = mCD ;
}
public List<TaskCommand> commands = new List<TaskCommand>();
public void AddTaskCommand(){
commands.Add(new TaskCommand());
}
public void RemoveCommand(){
if(commands.Count>0)
commands.RemoveAt(0);
}
public void RemoveAllCommand(){
commands.Clear();
}
//每隔固定时间就执行命令对列中的命令
public void Update(){
if(commands.Count<=0) return ;
mCurCD -= Time.deltaTime ;
if(mCurCD<=0){
commands[0].Execute();
commands.RemoveAt(0);
mCurCD = mCD ;
}
}
}
当然对列中的任务子类并不需要时一个子类实现的,也可以把commands使用ICommand去实现。remove方法也进行一些小小的修改。我们甚至可以给ICommand绑定一些特定的对象,让这些对象辅助执行命令任务。