设计模式C#实现(十五)——命令模式
- 意图
- 适用性
- 结构
- 实现
- 效果
- 参考
意图
将请求封装成一个对象,客户接受请求参数;可以对请求排队或者记录请求日志,以及可以支持撤销操作
适用性
- 抽象出待执行的动作以参数化某对象。命令模式是回调机制的一个面向对象的替代品
- 在不同的时刻指定、排列和执行请求
- 支持取消操作
- 支持修改日志
- 支持事务
结构
实现
使用遥控器,实现对一个灯的远程遥控。灯有开、关两个操作。
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();}}
运行结果
效果
- 将调用操作的对象与知道如何实现该操作的对象解耦
- 可以将多个命令装配成一个复合命令
- 增加新的命令无需修改已有的类
参考
- 《Head First 设计模式》
- 《设计模式》
转载于:https://www.cnblogs.com/castdream/p/5118544.html
设计模式C#实现(十五)——命令模式相关推荐
- 设计模式笔记之十四 (命令模式)
命令模式 命令模式是一种比较容易理解的设计模式,顾名思义,就是调用者发一个命令,有人给做完就行了,无关乎怎么做,也无关乎谁做. 我们继续我们以往的方式:理论联系实践的方式来理解命令模式. 最近我们实验 ...
- 设计模式学习笔记十五——Command模式
动机:将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦,并且支持对行为进行记录.撤销.重做.事务等处理. 场景:考虑一系列文档操作:打开.复制.剪切.粘帖. 结构 代码实现 /**//* ...
- Java设计模式之行为型:命令模式
前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...
- 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)
设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...
- 设计模式(一):命令模式(2)——命令模式扩展之宏命令
前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)--基本的命令模式 设计模式(一):命令模式(2)--命令模式扩展之宏命令 设计模式(一):命令模式(3)--命令模式扩展之队列请求 设计 ...
- 设计模式的C语言应用-命令模式-第五章
模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...
- php 命令设计模式示例,php设计模式(十九)命令模式-Fun言
命令模式就和名字一样: 比较适合执行命令的场景: 命令发送者只管调用具体命令类中的 execute() 方法: 然后在具体命令类中设定命令接收者: 可以消除命令发送者和命令接受者之间的耦合: 并且可以 ...
- 设计模式(十三): 命令模式
命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...
- 【OS学习笔记】二十五 保护模式七:任务和特权级保护对应的汇编源代码
本汇编代码是以下两篇文章讲解的内容的内核代码; [OS学习笔记]二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念 [OS学习笔记]二十四 保护模式七:调用门与依从的代码段----特权级保护 ...
- 围观设计模式(23)--行为型之命令模式(Command Pattern)
在面向对象程式设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动.命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被: 重复多次 取消(如果该物件有实作的话) 取消 ...
最新文章
- py获取前端的参数_微前端 qiankun 项目实践
- 【技术解决方案】优化FFmpeg编码器参数设置
- 创科视觉软件说明书_【纳博特斯克 | GGII】20192023年中国机器视觉行业调研
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
- leetcode-40-组合总和 II
- 系统损坏 mysql_mysql数据库损坏修复方法(适用window、Linux系统vps云主机)
- Keyboard项目中观察者模式解析
- 家用计算机选购,家用电脑该如何选择?什么配置比较好?看完这篇文章你就懂了...
- Bi系统 :poli部署
- 机器人行业疫情之下的“危”与“机”
- ​给想闷声发财的小伙伴35条忠告
- Android中连接MQTT服务器实现订阅主题并接收消息推送在通知栏显示(附代码下载)
- 感性和理性,个人的看法
- LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
- python 爬取腾讯漫画
- 将腾讯qlv格式的视频转换为mp4格式
- 复数与三角函数的转换
- 2020年超级计算机排名,2020中国高性能计算机TOP100榜单正式发布
- Win10注册表怎么打开
- 天美服务器未响应,王者荣耀服务器上热搜,无数玩家遭遇掉线烦恼,天美该怎么办?...