为了执行某个方法,会直接去调用这个方法,有这么一种情况并不适用于直接去调用方法,那就是未来执行某个方法系统必须满足一个特定的执行顺序或者语境,但是开发者没法去控制这个顺序时,解决这个问题的一个方案就是把方法分装在一个对象当中,这就是命令模式。
相当于有传令官,对整个命令进行封装,然后在依照命令顺序执行。
定义:讲一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化,对请求排队或记录请求日志,并支持可撤销操作。
基本代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
abstract
class
Command {
public
abstract
void
execute();
protected
Receiver receiver;
public
Command(Receiver receiver){
this
.receiver = receiver;
}
}
public
class
ConcreteCommand
extends
Command {
public
ConcreteCommand(Receiver receiver){
super
(receiver);
}
@Override
public
void
execute() {
receiver.action();
}
}
|
传达着代码:
1
2
3
4
5
6
7
8
9
|
public
class
Invoker {
private
Command command;
//这里可以很方便的形成一个命令队列,对不要的命令可以删除和增加
public
void
setCommand(Command command) {
this
.command = command;
}
public
void
executeCommand(){
command.execute();
}
}
|
1
2
3
4
5
6
|
//命令执行者
public
class
Receiver {
public
void
action(){
System.out.println(
"execute the request"
);
}
}
|
客户端:
1
2
3
4
5
6
7
|
public
static
void
main(
String
[] args) {
Receiver receiver=
new
Receiver();
Command command =
new
ConcreteCommand(receiver);
Invoker invoker =
new
Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
|
命令模式的优点很明显的,首先,命令模式可以很容易的设计一个命令的队列,可以较方便的将命令记录到日志中去。可以允许接受请求的哪一方来决定是否要否决请求,可以比较容易的实现对请求的撤销和重做。最后,可以比较容易地实现对请求的撤销和重做。
命令模式适用于以下几种情况:
1、当需要抽象出待执行的动作以便参数化某个对象时。
2、当需要在不同的时刻执行、排列以及执行请求时。
3、当系统需要支持取消操作时。
4、当系统需要记录、修改日志时。
命令模式可以将发送者和接收者完全解耦,发送者和接收者之间不会出现直接引用关系,发送请求的对象只需要知道如何去发送请求,而不必知道如何去完成请求,这就是命令模式的模式动机。
命令模式允许请求的一方和接收的一方相互独立开来,这使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是如何被接收的。以及操作是否被执行,以及是怎么被执行的等。命令模式的关键就在于引入了抽象命令接口,并且发送者针对抽象命令接口进行编程,只有实现了抽象命令接口的具体命令才能与接收者相互关联。
命令模式的优点如下:
1、降低了系统的耦合度。
2、新的命令可以很容易地加入到当前系统中。
3、可以比较容易地设计一个命令队列和组合命令。
4、可以方便地实现对请求的撤销和重做。