设计模式- 命令模式(Command Pattern)
2019-05-04 本文已影响0人
易兒善
定义
命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护。命令模式的核心思想是将请求封装为一个对象,将其作为命令发起者和接收者的中介,而抽象出来的命令对象又使得能够对一系列请求进行操作,如对请求进行排队,记录请求日志以及支持可撤销的操作等。
C#例子
public abstract class Command
{
public abstract void Excute(Receiver receiver);
}
public class CreateOrderCommand : Command
{
public override void Excute(Receiver receiver)
{
Console.WriteLine("创建单据完成!");
}
}
public class ChangeStockCommand : Command
{
public override void Excute(Receiver receiver)
{
Console.WriteLine("扣减库存完成!");
}
}
public class Receiver
{
}
public class Invoker
{
private IList<Command> _commands = new List<Command>();
public Invoker AddCommand(Command command) {
_commands.Add(command);
return this;
}
public void Excute(Receiver receiver) {
foreach (var command in _commands) {
command.Excute(receiver);
}
}
}
class Program
{
static void Main(string[] args)
{
Receiver receiver = new Receiver();
new Invoker()
.AddCommand(new CreateOrderCommand())
.AddCommand(new ChangeStockCommand())
.Excute(receiver);
}
}
命令模式参与者:
- Command:命令抽象类,声明一个执行操作的接口Execute,该抽象类并不实现这个接口,所有的具体命令都继承自命令抽象类。
- *Command:Command的实现类,定义一个接收者对象与动作之间的请求绑定,调用Receiver的操作,实现Execute方法
- Invoker:命令的接收者,将命令请求传递给相应的命令对象,每个*Command都是一个Invoker的成员
- Receiver:命令的接收者,知道如何实施与执行一个请求相关的操作
命令模式适用情形:
- 将用户界面和行为分离,使两者的开发可以并行不悖。
- 在需要指定、排列和执行一系列请求的情况下,适用命令模式。
- 支持修改日志。
命令模式优点:
-
命令模式将调用操作对象和知道如何实现该操作对象的解耦。
-
在Command要增加新的处理操作对象很容易,可以通过创建新的继承自Command的子类来实现。
-
命令模式可以和Memento模式结合使用,支持取消的操作。
-
支持日志、请求队列和复合命令。
其他
源码地址
其他设计模式