设计模式-行为型-命令模式
命令模式是对命令的封装,每一个命令都是一个操作(处理方法),请求方放出请求要求执行一个操作,接收方收到请求并执行操作。对请求放和接收方进行了解耦。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、命令模式(Command)
命令模式是对命令的封装,每一个命令都是一个操作(处理方法),请求方放出请求要求执行一个操作,接收方收到请求并执行操作。对请求放和接收方进行了解耦。
二、应用场景
命令模式是对命令的封装,每一个命令都是一个操作(处理方法),请求方放出请求要求执行一个操作,接收方收到请求并执行操作。对请求放和接收方进行了解耦。
三、角色
- 接收者角色(Receiver):负责具体实施或执行一个请求。
- 命令角色(ICommand):定义需要执行的所有命令行为。
- 具体命令角色(ConcreteCommand):该类内部存在一个接收者角色属性,并通过具体命令来调用该属性的方法。
- 请求者角色(Invoker):接收客户端的命令,并执行命令
二、代码示例
1.示例场景:
当我们去餐厅吃饭时,我们选好菜单后交给服务员,服务员将菜单分别提交给吧台和后厨,然后由吧台和后厨来执行我们的需求(命令),我们就属于请求者。
2.添加实际执行方法
代码如下(示例):接受命令角色,命令具体执行方法。
/// <summary>
/// 接受命令角色
/// </summary>
public class HotelReceiver
{
public void Action(string where,string what)
{
Console.WriteLine($"{where}收到命令,开始加工{what}");
}
}
3. 抽象命令角色
代码如下(示例):提取所有的可执行的命令
/// <summary>
/// 抽象命令角色
/// </summary>
public interface IHotelCommand
{
void DoAnyFoods();
void DoAnyDrink();
}
4.具体命令的详细操作
代码如下(示例):实现抽象命令中,不同命令的不同实现。
/// <summary>
/// 具体命令
/// </summary>
public class HotelConcretcCommand : IHotelCommand
{
private readonly HotelReceiver _hotelReceiver=new HotelReceiver();
public void DoAnyFoods()
{
Console.WriteLine("食物");
_hotelReceiver.Action("后厨", "食物");
}
public void DoAnyDrink()
{
Console.WriteLine("酒水");
_hotelReceiver.Action("吧台","酒水");
}
}
5.请求者(下单的人)
代码如下(示例):发送命令请求的角色,事件的起点。
/// <summary>
/// 请求者
/// </summary>
public class HotelInvoker
{
private IHotelCommand _hotelCommand;
public HotelInvoker(IHotelCommand hotelCommand)
{
_hotelCommand = hotelCommand;
}
public void MakeFoodOrder()
{
Console.WriteLine("下菜单");
_hotelCommand.DoAnyFoods();
_hotelCommand.DoAnyDrink();
}
}
6.客户端测试调用方法
代码如下(示例):为了调用请求者方法,实现命令模式的展现。
/// <summary>
/// 客户端
/// </summary>
public class CommandClient
{
public void DoCommandClient()
{
IHotelCommand hotelCommand = new HotelConcretcCommand();
HotelInvoker invoker =new HotelInvoker(hotelCommand);
invoker.MakeFoodOrder();
}
}
7.运行结果
代码如下(示例):为了调用请求者方法,实现命令模式的展现。
下菜单
食物
后厨收到命令,开始加工食物
酒水
吧台收到命令,开始加工酒水
该处使用的url网络请求的数据。
总结
优点
- 通过抽象接口,实现了命令请求与实现的解耦
- 扩展性能,很容易增加新命令
- 支持组合命令和命令队列
- 可以在现有命令基础上增加额外功能,(日志记录)
缺点
- 具体命令类可能很多