文章目录
  1. 1. 模式定义
  2. 2. 模式结构
  3. 3. UML图
  4. 4. 代码实现
    1. 4.1. Command.java
    2. 4.2. ConcreteCommand.java
    3. 4.3. Receiver.java
    4. 4.4. Invoker.java
    5. 4.5. 测试类
    6. 4.6. 运行结果
  5. 5. 模式分析
  6. 6. 命令模式的优点
  7. 7. 命令模式的缺点

今天我们来学习一种行为型模式,它就是命令模式(Command Pattern)。

模式定义

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

模式结构

命令模式包含如下角色:

Command: 抽象命令类
ConcreteCommand: 具体命令类
Invoker: 调用者
Receiver: 接收者
Client: 客户类

UML图

代码实现

Command.java

1
2
3
4
5
6
7
8

/**
* 抽象命令角色
*/
public interface Command {

void execute();
}

ConcreteCommand.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/**
* 具体命令角色类
*/
public class ConcreteCommand implements Command {

private Receiver mReceiver;

public ConcreteCommand(Receiver receiver) {
mReceiver = receiver;
}

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

Receiver.java

1
2
3
4
5
6
7
8
9
10

/**
* 接收者
*/
public class Receiver {

public void action() {
System.out.println("execute operation");
}
}

Invoker.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
*  请求者角色类
*/
public class Invoker {

private Command mCommand;

public Invoker(Command command) {
mCommand = command;
}

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

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13

/**
* 测试类
*/
public class MyClass {

public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}

运行结果

模式分析

  • 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。

  • 每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。

  • 命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

  • 命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。

  • 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

命令模式的优点

  • 降低系统的耦合度。

  • 新的命令可以很容易地加入到系统中。

  • 可以比较容易地设计一个命令队列和宏命令(组合命令)。

  • 可以方便地实现对请求的Undo和Redo。

命令模式的缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

代码已经放到GitHub上了https://github.com/HJXANDHMR/DesignPattern

参考
http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

文章目录
  1. 1. 模式定义
  2. 2. 模式结构
  3. 3. UML图
  4. 4. 代码实现
    1. 4.1. Command.java
    2. 4.2. ConcreteCommand.java
    3. 4.3. Receiver.java
    4. 4.4. Invoker.java
    5. 4.5. 测试类
    6. 4.6. 运行结果
  5. 5. 模式分析
  6. 6. 命令模式的优点
  7. 7. 命令模式的缺点