命令模式(Command Pattern)
命令模式将请求/命令封装为一个对象,可以使用不同的请求参数化其他对象,并且能够支持请求的排队执行、记录日志、撤销等功能。
结构图:
角色:
- 发送者(Sender)/触发者(Invoker):负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。
- 命令(Command):接口通常仅声明一个执行命令的方法。
- 具体命令(Concrete Commands):会实现各种类型的请求。大部分情况下具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。
- 接受者(Receiver):接收者执行与请求相关的操作,具体实现对请求的业务处理。任何类都可以作为接受者。
适用场景:
- 需要客户端自己控制命令的执行时。
优点:
- 解耦触发和执行操作的类。符合单一原则。
- 可以将一组简单命令组合成一个复杂命令。
- 可以实现撤销、恢复、延迟功能。
缺点:
- 每一个命令都需要设计一个具体命令类,增加系统复杂度。
代码(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
|
public class Invoker { private ICommand _command;
public Invoker(ICommand command) { _command = command; }
public void Call() { _command.Execute(); } }
public interface ICommand { void Execute(); }
public class SimpleCommand : ICommand { public void Execute() { Console.WriteLine("SimpleCommand"); } }
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); } }
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();
|
最后
命名模式看起来和策略模式很相似,在在策略模式中,不同的策略具有相同的目的、不同的实现、互相之间可以替换。譬如不同的排序算法都是为了排序。而在命名模式中,不同的命名需要达成的目的是不一样的。