Home 命令模式
Post
Cancel

命令模式

Command Pattern 对象行为型模式

意图

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

结构

命令模式

其中:

  • Command 声明执行操作的接口
  • ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现 Execute
  • Client 创建一个具体命令对象并设定它的接收者
  • Invoker 要求该命令执行这个请求
  • Receiver 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者

适用性

Command 模式适用于:

  • 抽象出待执行的动作以参数化某对象
  • 在不同的时刻指定、排列和执行请求
  • 支持取消操作
  • 支持修改日志
  • 用构建在原语操作上的高层操作构造一个系统

例子

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class CommandPattern {
    public static void main(String[] args) {
        // 接收者 对象 电视机
        Tv tv = new Tv();

        // 命令对象
        Command oncommand = new OnCommand(tv);
        Command offcommand = new OffCommand(tv);

        // 请求者
        Invoker invoker = new Invoker();

        // 开机
        invoker.setCommand(oncommand);
        invoker.Execute();
        // 关机
        invoker.setCommand(offcommand);
        invoker.Execute();
    }
}

class Invoker{ // 请求者
    private Command command; // 命令

    public void setCommand(Command command){ // 设置请求者 的 请求的命令
        this.command = command;
    }

    public void Execute(){ // 执行命令
        command.Execute();
    }
}

interface Command{ // 命令接口
    public void Execute(); // 执行命令
}

class OnCommand implements Command{ // 开机命令
    private Tv tv;

    public OnCommand(Tv tv){
        this.tv = tv;
    }

    @Override
    public void Execute(){
        tv.OnAction();
    }
}

class OffCommand implements Command{ // 关机命令
    private Tv tv;

    public OffCommand(Tv tv){
        this.tv = tv;
    }

    @Override
    public void Execute(){
        tv.OffAction();
    }
}
class Tv{ // 接收者 电视机
    public void OnAction(){
        System.out.println("Tv On");
    }

    public void OffAction(){
        System.out.println("Tv Off");
    }
}
This post is licensed under CC BY 4.0 by the author.

责任链模式

解释器模式