• 意图
  • 适用性
  • 结构
  • 实现
  • 效果
  • 参考

意图

将请求封装成一个对象,客户接受请求参数;可以对请求排队或者记录请求日志,以及可以支持撤销操作

适用性

  • 抽象出待执行的动作以参数化某对象。命令模式是回调机制的一个面向对象的替代品
  • 在不同的时刻指定、排列和执行请求
  • 支持取消操作
  • 支持修改日志
  • 支持事务

结构

实现

使用遥控器,实现对一个灯的远程遥控。灯有开、关两个操作。

  class Light{public void On(){Console.WriteLine("light is on");}public void Off(){Console.WriteLine("light is off");}}

首先抽象出操作类或者接口

  public interface ICommand{void Execute();void Undo();//撤销}

对这开、关两个操作请求进行封装,操作需要一个对象作为初始化参数

 class LightOnCommand : ICommand{private Light _light;public LightOnCommand(Light light){this._light = light;}public void Execute(){_light.On();}public void Undo(){_light.Off();}}class LightOffCommand:ICommand{private Light _light;public LightOffCommand(Light light){this._light = light;}public void Execute(){_light.Off();}public void Undo(){_light.On();}}

遥控器接受请求作为初始化参数

class SimpleRemoteControl{private ICommand _onSlot;private ICommand _offSlot;private ICommand _lastCommand;//记录最后一次操作请求public void SetCommand(ICommand onCommand,ICommand offCommand){_onSlot = onCommand;_offSlot = offCommand;}public void OnButtonWasPressed(){_onSlot.Execute();_lastCommand = _onSlot;}public void OffButtonWasPressed(){_offSlot.Execute();_lastCommand = _offSlot;}public void Undo(){_lastCommand.Undo();}}

使用封装好的请求对客户(遥控器)进行参数化,使其可以控制灯,也可以封装更多操作,使遥控器可以控制其他物品

 class Program{static void Main(string[] args){SimpleRemoteControl remote = new SimpleRemoteControl();Light light = new Light();LightOnCommand lightOn = new LightOnCommand(light);LightOffCommand lightOff = new LightOffCommand(light);remote.SetCommand(lightOn, lightOff);remote.OnButtonWasPressed();remote.OffButtonWasPressed();remote.Undo();//撤销上一步操作Console.ReadKey();}}

运行结果

效果

  • 将调用操作的对象与知道如何实现该操作的对象解耦
  • 可以将多个命令装配成一个复合命令
  • 增加新的命令无需修改已有的类

参考

  1. 《Head First 设计模式》
  2. 《设计模式》

转载于:https://www.cnblogs.com/castdream/p/5118544.html

设计模式C#实现(十五)——命令模式相关推荐

  1. 设计模式笔记之十四 (命令模式)

    命令模式 命令模式是一种比较容易理解的设计模式,顾名思义,就是调用者发一个命令,有人给做完就行了,无关乎怎么做,也无关乎谁做. 我们继续我们以往的方式:理论联系实践的方式来理解命令模式. 最近我们实验 ...

  2. 设计模式学习笔记十五——Command模式

    动机:将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦,并且支持对行为进行记录.撤销.重做.事务等处理. 场景:考虑一系列文档操作:打开.复制.剪切.粘帖. 结构 代码实现 /**//*   ...

  3. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

  4. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  5. 设计模式(一):命令模式(2)——命令模式扩展之宏命令

    前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)--基本的命令模式 设计模式(一):命令模式(2)--命令模式扩展之宏命令 设计模式(一):命令模式(3)--命令模式扩展之队列请求 设计 ...

  6. 设计模式的C语言应用-命令模式-第五章

    模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...

  7. php 命令设计模式示例,php设计模式(十九)命令模式-Fun言

    命令模式就和名字一样: 比较适合执行命令的场景: 命令发送者只管调用具体命令类中的 execute() 方法: 然后在具体命令类中设定命令接收者: 可以消除命令发送者和命令接受者之间的耦合: 并且可以 ...

  8. 设计模式(十三): 命令模式

    命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...

  9. 【OS学习笔记】二十五 保护模式七:任务和特权级保护对应的汇编源代码

    本汇编代码是以下两篇文章讲解的内容的内核代码; [OS学习笔记]二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念 [OS学习笔记]二十四 保护模式七:调用门与依从的代码段----特权级保护 ...

  10. 围观设计模式(23)--行为型之命令模式(Command Pattern)

    在面向对象程式设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动.命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被: 重复多次 取消(如果该物件有实作的话) 取消 ...

最新文章

  1. py获取前端的参数_微前端 qiankun 项目实践
  2. 【技术解决方案】优化FFmpeg编码器参数设置
  3. 创科视觉软件说明书_【纳博特斯克 | GGII】20192023年中国机器视觉行业调研
  4. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
  5. leetcode-40-组合总和 II
  6. 系统损坏 mysql_mysql数据库损坏修复方法(适用window、Linux系统vps云主机)
  7. Keyboard项目中观察者模式解析
  8. 家用计算机选购,家用电脑该如何选择?什么配置比较好?看完这篇文章你就懂了...
  9. Bi系统 :poli部署
  10. 机器人行业疫情之下的“危”与“机”
  11. ​给想闷声发财的小伙伴35条忠告
  12. Android中连接MQTT服务器实现订阅主题并接收消息推送在通知栏显示(附代码下载)
  13. 感性和理性,个人的看法
  14. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
  15. python 爬取腾讯漫画
  16. 将腾讯qlv格式的视频转换为mp4格式
  17. 复数与三角函数的转换
  18. 2020年超级计算机排名,2020中国高性能计算机TOP100榜单正式发布
  19. Win10注册表怎么打开
  20. 天美服务器未响应,王者荣耀服务器上热搜,无数玩家遭遇掉线烦恼,天美该怎么办?...

热门文章

  1. 总结自己的Git常用命令
  2. 解决'ping' 不是内部或外部命令,也不是可运行的程序
  3. ***测试技巧总结更新篇3
  4. Java学习之移动文件(转)
  5. GEF常见问题8:导出到图片
  6. linux的文件系统及节点表
  7. html5的video元素学习手札
  8. 教你打造优秀IT博文
  9. 重拾-Spring Transaction
  10. cv2.resize