设计模式(十)—— 命令模式

命令模式

定义:讲一个请求封装成一个对象,使发出请求的责任和执行请求的责任分隔开。两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

通用类图:

从类图中可以看到有三个角色:

  • Command命令角色:需要执行的所有命令都在这里声明。
  • Receiver接收者角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
  • Invoker调用者角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

命令模式的实现:

定义抽象接收者和其实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class Receiver {

public abstract void doSomething();
}

public class ConcreteReciver1 extends Receiver {
@Override
public void doSomething() {
System.out.println("接收者1处理");
}
}

public class ConcreteReciver2 extends Receiver {
@Override
public void doSomething() {
System.out.println("接收者2处理");
}
}

接收者可以有多个,根据具体的业务来定义

定义命令角色:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public abstract class Command {
public abstract void execute();
}

public class ConcreteCommand1 extends Command {
private Receiver receiver;

public ConcreteCommand1(Receiver receiver) {
this.receiver = receiver;
}

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

public class ConcreteCommand2 extends Command {

private Receiver receiver;

public ConcreteCommand2(Receiver receiver) {
this.receiver = receiver;
}

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

命令类的实现也可以有多个。

调用者Invoker:

1
2
3
4
5
6
7
8
9
10
11
12
public class Invoker {

private Command command;

public void setCommand(Command command) {
this.command = command;
}

public void action(){
this.command.execute();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main {

public static void main(String[] args) {
// System.out.println("Hello World!");
// 声明调用者Invoker
Invoker invoker = new Invoker();
// 定义接收者
Receiver receiver = new ConcreteReciver1();
Command command = new ConcreteCommand1(receiver);
invoker.setCommand(command);
invoker.action();

Receiver receiver2 = new ConcreteReciver2();
Command command2 = new ConcreteCommand2(receiver2);
invoker.setCommand(command2);
invoker.action();



}
}

接收者1处理
接收者2处理

命令模式优点:

  • 类间解耦:调用者角色和接收者角色之间没有依赖,调用者实现功能时值需要调用Command抽象类的execute方法就可以,不需要了解是哪个接收者执行。
  • 可扩展性:Command的子类可以很容易扩展,调用者和高层次的模块的Client不产生严重的耦合。
  • 命令模式结合其他模式使用效果更好。可以结合责任链模式,实现命令族解析任务;结合模板方法模式,可以减少Command子类的膨胀问题。

缺点:

可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性

使用场景:

  1. 当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。
  2. 当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。
  3. 当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。
  4. 当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。

代码GitHub


欢迎关注公众号:
公众号微信

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
显示 Gitment 评论