命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。 3、可以比较容易地设计一个组合命令(宏命令)。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
适用场景
1.命令的发送者和命令执行者有不同的生命周期。命令发送了并不是立即执行。
2.命令需要进行各种管理逻辑(当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能)。
3.需要支持撤消\重做操作,可以将命令对象存储起来,采用备忘录模式来实现。
结构与实现
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
命令模式涉及到五个角色,它们分别是:
1、客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
2、命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
3、具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
4、请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
5、接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
代码实现:
1 | //接收者角色类 |
组合命令模式
在软件开发中,有时将命令模式与组合模式联合使用,这就构成了宏命令模式,也叫组合命令模式。宏命令包含了一组命令,它充当了具体命令与调用者的双重角色,执行它时将递归调用它所包含的所有命令,其具体结构图如图:
程序代码如下:
1 | //抽象命令 |