Zer0e's Blog

设计模式之命令模式

字数统计: 783阅读时长: 2 min
2020/08/17 Share

前言

今天来讲讲命令模式。

正文

概念

命令模式属于行为型设计模式,又称为行动模式或者交易模式,这个模式常常用在游戏开发设计中。命令模式把请求以命令的形式封装在对象中,并传给调用对象,然后调用对象寻找可以处理这个命令的对象,把命令传给相应的对象,执行命令。
常见的应用场景有游戏开发中命令角色执行操作,还有GUI开发中事件也属于命令模式中的一种。

实现

命令模式是把发出命令与执行命令的职责分隔开,委派给不同的对象,所以它允许请求与接收方相互独立,两方可以不知道对方的接口,甚至不需要知道命令是否被接收或者被执行。
命令模式中有几个角色:

  • 命令(Command/Order):可以是一个接口,声明命令的抽象接口
  • 具体命令:实现命令的具体类,通常有execute()方法,用于调用接收者的操作。
  • 请求者(Invoker):负责调用命令对象去执行这个命令。
  • 接收者(Receiver):负责具体执行一个命令。

我们先简单实现一个命令模式demo。
先创建Receiver对象,设置action方法,即收到命令会执行什么。

1
2
3
4
5
public class Receiver {
public void action(){
System.out.println("执行命令");
}
}

接着我们创建command接口与它的具体实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface Command {
void execute();
}
public class ConcreteCommand implements Command{
private Receiver receiver = null;
public ConcreteCommand(Receiver receiver) {
//这里我们把具体接收者当作参数传给具体命令类
this.receiver = receiver;
}

@Override
public void execute() {
receiver.action();
}
}

然后是创建请求者,这里把命令当作参数传给请求者。

1
2
3
4
5
6
7
8
9
10
11
public class Invoker {
private Command command = null;

public Invoker(Command command) {
this.command = command;
}

public void action(){
command.execute();
}
}

最后是客户端调用

1
2
3
4
5
6
7
8
9
10
11
public class Client {
public static void main(String[] args) {
//创建接收者
Receiver receiver = new Receiver();
//创建具体命令,设置它的接收者
Command command = new ConcreteCommand(receiver);
//创建请求类,把命令传入
Invoker invoker = new Invoker(command);
invoker.action();
}
}

这里invoker的值传入,是通过构造方法注入,但实际中,我们的invoker对象往往需要接收许多个命令,这时我们在invoker中就可以设置set方法,将command对象通过setCommand方法注入,实现一个invoker对象循环使用的目的。

优缺点

命令模式的优点就是调用者与接受者之间没有依赖关系,调用者实现功能只需要调用Command类中的execute方法就可以,不必关心接受者是谁,怎么接收。其次就是命令模式易扩展,实现command接口就可以实现新命令,在装配时,把具体的对象设置到命令中就可以使用这个命令,而invoker与Client已有代码不用发生改变。
缺点在于命令模式可能会导致具体命令类过多,不易维护。

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 概念
    2. 2.2. 实现
    3. 2.3. 优缺点