设计模式-行为型-命令模式

设计模式-行为型-命令模式

命令模式是对命令的封装,每一个命令都是一个操作(处理方法),请求方放出请求要求执行一个操作,接收方收到请求并执行操作。对请求放和接收方进行了解耦。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、命令模式(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网络请求的数据。


总结

优点

  • 通过抽象接口,实现了命令请求与实现的解耦
  • 扩展性能,很容易增加新命令
  • 支持组合命令和命令队列
  • 可以在现有命令基础上增加额外功能,(日志记录)

缺点

  • 具体命令类可能很多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenny@chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值