Command命令模式属于行为型设计模式,将请求封装为一个对象,从而允许对不同请求的客户端进行参数化,并提供请求的历史记录。它还允许撤销请求。
Design Pattern:Command 🔗
基本介绍 🔗
构成 🔗
- Client:客户角色类,创建具体的命令对象,并且设置命令对象的接收者。
- Command:命令接口,声明一个用于执行操作的接口。
- ConcreteCommand:具体命令类,Command的实现对象,要持有Receiver,并调用Receiver的功能来完成命令要执行的操作。
- Invoker:请求者类,使用命令对象的入口,持有很多命令对象,真正触发命令并要求命令执行相应操作的地方。
- Receiver:接受者类,真正执行命令的对象。
优点 🔗
- 命令模式属于可扩展的设计模式,可以在不更改或干扰现有类和代码的情况下添加更多命令。
- 可以实现命令延迟。
- 对命令进行记录的功能,可以实现对请求的Undo和Redo操作。
- 多个命令对象可以组合使用,形成复杂的命令。
缺点 🔗
- 代码变得负责,同时增加出不少具体命令类。
实例 🔗
C#中命令模式的实例,我干了两天厨师觉得不太累了,于是决定改行房地产,于是我来到了家族旗下的房地产公司当起了建筑师,主要任务是盖房。
/// <summary>
/// Receiver 接受者类
/// </summary>
public class Receiver
{
public void BuildWall()
{
Console.WriteLine("建造墙体。");
}
public void PullDownWall()
{
Console.WriteLine("拆毁墙体。");
}
public void BuildRoof()
{
Console.WriteLine("建造房顶。");
}
public void PullDownRoof()
{
Console.WriteLine("拆毁房顶。");
}
}
/// <summary>
/// Command 命令接口
/// </summary>
public interface ICommand
{
/// <summary>
/// 执行
/// </summary>
void Do();
/// <summary>
/// 撤销
/// </summary>
void UnDo();
}
/// <summary>
/// ConcreteCommand 建墙
/// </summary>
public class BuildWallCmd : ICommand
{
private readonly Receiver _receiver;
public BuildWallCmd(Receiver receiver)
{
_receiver = receiver;
}
public void Do()
{
_receiver.BuildWall();
}
public void UnDo()
{
_receiver.PullDownWall();
}
}
/// <summary>
/// ConcreteCommand 建房顶
/// </summary>
public class BuildRoofCmd : ICommand
{
private readonly Receiver _receiver;
public BuildRoofCmd(Receiver receiver)
{
_receiver = receiver;
}
public void Do()
{
_receiver.BuildRoof();
}
public void UnDo()
{
_receiver.PullDownRoof();
}
}
/// <summary>
/// Invoker 调用类
/// </summary>
public class Invoker
{
/// <summary>
/// 执行指令记录
/// </summary>
private readonly List<ICommand> _commands = new List<ICommand>();
public void AddAndExecute(ICommand command)
{
_commands.Add(command);
command.Do();
}
}
实际运行:
Receiver receiver = new Receiver();
Invoker invoker = new Invoker();
BuildWallCmd buildWallCmd = new BuildWallCmd(receiver);
BuildRoofCmd buildRoofCmd = new BuildRoofCmd(receiver);
invoker.AddAndExecute(buildWallCmd);
invoker.AddAndExecute(buildRoofCmd);
结论 🔗
搬砖愉快!