设计模式 <行为型> | 命令模式

命令模式(Command Pattern)

命令模式将请求/命令封装为一个对象,可以使用不同的请求参数化其他对象,并且能够支持请求的排队执行、记录日志、撤销等功能。

结构图:

角色:

  1. 发送者(Sender)/触发者(Invoker):负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。
  2. 命令(Command):接口通常仅声明一个执行命令的方法。
  3. 具体命令(Concrete Commands):会实现各种类型的请求。大部分情况下具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。
  4. 接受者(Receiver):接收者执行与请求相关的操作,具体实现对请求的业务处理。任何类都可以作为接受者。

适用场景:

  1. 需要客户端自己控制命令的执行时。

优点:

  1. 解耦触发和执行操作的类。符合单一原则。
  2. 可以将一组简单命令组合成一个复杂命令。
  3. 可以实现撤销、恢复、延迟功能。

缺点:

  1. 每一个命令都需要设计一个具体命令类,增加系统复杂度。

代码(C#)

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
72
73
74
75
76
77
78
79
80
/// <summary>
/// 发送者 (Sender/Invoker)
/// </summary>
public class Invoker
{
private ICommand _command;

public Invoker(ICommand command)
{
_command = command;
}

public void Call()
{
_command.Execute();
}
}

/// <summary>
/// 命令
/// </summary>
public interface ICommand
{
void Execute();
}

/// <summary>
/// 具体命令
/// </summary>
public class SimpleCommand : ICommand
{
/// <summary>
/// 自行完成一些简单的操作
/// </summary>
public void Execute()
{
Console.WriteLine("SimpleCommand");
}
}

/// <summary>
/// 具体命令
/// </summary>
public class ComplexCommand : ICommand
{
private Receiver _receiver;

private string _str;

public ComplexCommand(Receiver receiver, string str)
{
_receiver = receiver;
_str = str;
}

public void Execute()
{
Console.WriteLine("ComplexCommand");
_receiver.Action(_str);
}
}

/// <summary>
/// 接受者
/// </summary>
public class Receiver
{
public void Action(string str)
{
Console.WriteLine($"Receiver {str}");
}
}

Invoker invoker = new Invoker(new SimpleCommand());
invoker.Call();

Receiver receiver = new Receiver();
Invoker invoker1 = new Invoker(new ComplexCommand(receiver, "lll"));
invoker1.Call();

最后

命名模式看起来和策略模式很相似,在在策略模式中,不同的策略具有相同的目的、不同的实现、互相之间可以替换。譬如不同的排序算法都是为了排序。而在命名模式中,不同的命名需要达成的目的是不一样的。


设计模式 <行为型> | 命令模式
http://example.com/posts/22977.html
作者
她微笑的脸y
发布于
2023年3月14日
许可协议