命令模式中有三个角色,第一个是命令的执行者,这个类中定义好各种方法,只负责做事情(根据传递过来的命令调用不同方法完成操作),是个典型的model,本身并不加任何control的逻辑。第二个角色是命令。命令类会有一个抽象的接口,这个接口派生出一个个具体的命令类,每个具体命令类只负责一个逻辑,它的构造函数要传入一个参数,这个参数就是执行者,将这个参数通过构造函数传给命令类,让命令类知道让谁去执行。命令类中会有一个方法,用于让执行者开始执行这个命令类的指定动作,也就是根据这个命令类的职责去调用执行者的相关方法。第三个角色是服务员。服务员有一个数组类型的属性,用于保存命令对象。然后会有三个方法,一个用于添加命令对象,这个方法需要通过传入一个命令对象类型的参数,来实现对命令数组的添加。然后是删除命令方法,这个方法也要传入一个命令对象类型的参数,来实现对指定命令的删除。最后一个方法是通知执行者开始工作的方法。这个方法通过遍历命令对象数组,来逐一调用命令对象的执行方法,间接让命令执行者一一执行相关的命令(执行相关方法)。
命令模式可以让“动作的请求者”从“动作的执行者”对象中解耦。
命令模式的优点:
1.它能较容易地设计一个命令队列;
2.允许接收请求的一方决定是否要否决请求;
3.在需要的情况下,可以容易地将命令记入日志;
4.可以容易地实现对请求的撤消和重做;
5.由于加进新的具体命令类不影响其它的类,因此增加新的具体命令类很容易;
6.命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。可以让类的单一职责更明确,充分解耦。