用最简单的例子理解命令模式(Command Pattern)
假设想让遥控器控制电灯的开关、电视机的开关和切换,该如何做?
所有的开、关、切换都是遥控器发出的指令,把这些指令统一抽象成一个接口。
public interface IControl{void Execute();}
把电灯、电视机抽象成类。
public class Tv{public void TurnOn(){Console.WriteLine("电视机打开了");}public void TurnOff(){Console.WriteLine("电视机关闭了");}public void SwitchChannel(){Console.WriteLine("电视机切换频道");}}public class Light{public void TunrOn(){Console.WriteLine("电灯打开了");}public void TurnOff(){Console.WriteLine("电灯关闭了");}}
Tv类的TurnOn(),TurnOff(),SwitchChannel(),Light类的TurnOn(),TurnOff(),这些方法都会通过执行IController的Execute方法被触发。把每一种动作抽象成类,并实现IControl接口。
public class LighOn : IControl{private Light _light;public LighOn(Light light){_light = light;}public void Execute(){_light.TunrOn();}}public class LightOff : IControl{private Light _light;public LightOff(Light light){_light = light;}public void Execute(){_light.TurnOff();}}public class TvOn : IControl{private Tv _tv;public TvOn(Tv tv){_tv = tv;}public void Execute(){_tv.TurnOn();}}public class TvOff : IControl{private Tv _tv;public TvOff(Tv tv){_tv = tv;}public void Execute(){_tv.TurnOff();}}public class TvSwitch : IControl{private Tv _tv;public TvSwitch(Tv tv){_tv = tv;}public void Execute(){_tv.SwitchChannel();}}
现在,电视机和电灯有了,触发各种动作的类有了,遥控器该装下这些指令(提供装下指令的方法)并提供方法供客户端调用。
public class RemoteControl{private IList<IControl> onCommands = new List<IControl>();private IList<IControl> offCommands = new List<IControl>();private IList<IControl> switchCommands = new List<IControl>();public void AddOnCommand(IControl control){onCommands.Add(control);}public void AddOffCommand(IControl control){offCommands.Add(control);}public void AddSwitchCommand(IControl control){switchCommands.Add(control);}public void PressOnButton(int number){onCommands[number].Execute();}public void PressOffButton(int number){offCommands[number].Execute();}public void PressSwitchButton(int number){switchCommands[number].Execute();}}
客户端的执行逻辑大致是:把电视机、电灯准备好,把各种指令准备好,拿出遥控器把各种指令收纳其中,最后调用遥控器的方法执行各种指令。
class Program{static void Main(string[] args){//命令的接收方Light light = new Light();Tv tv = new Tv();//各种命令LighOn turnLightOn = new LighOn(light);LightOff turnLightOff = new LightOff(light);TvOn turnTvOn = new TvOn(tv);TvOff turnTvOff = new TvOff(tv);TvSwitch switchTv = new TvSwitch(tv);//RemoteConroller组装命令RemoteControl control = new RemoteControl();control.AddOnCommand(turnLightOn);control.AddOnCommand(turnTvOn);control.AddOffCommand(turnLightOff);control.AddOffCommand(turnTvOff);control.AddSwitchCommand(switchTv);control.PressOnButton(0);Console.ReadKey();}}
总结:命令模式的需求源自想通过一个指令(比如这里IControl的Execute方法)来控制多个类的多个方法,包含了几个要素:
1、命令:让类的各种方法抽象成类实现一个接口
2、装配命令:把各种命令放到一个集合中
3、触发命令:提供方法调用命令集合中的某条命令,让其执行指令
用最简单的例子理解命令模式(Command Pattern)的更多相关文章
- 用最简单的例子理解备忘录模式(Memento Pattern)
简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...
- 用最简单的例子理解复合模式(Composite Pattern)
在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...
- 用最简单的例子理解迭代器模式(Iterator Pattern)
迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
随机推荐
- 关于SizeOf、Length
结论: 到底什么时候用Length,SizeOf呢,我总结下使用Length,Sizeof的场景 1.Length(静态数组或动态数组)----没有问题 2.Length(string/shortst ...
- MySQL 5.1完全卸载
第一步:控制面板里的增加删除程序内进行删除 第二步:删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 第三步:regedit进入注册表 HKEY_LOCAL_MACHIN ...
- 计算a+b
输入: 1 2 结果: 3 说明:只能输入数字,两数间只有一个空格 代码如下:(vc6编译) #include <stdio.h> #include <conio.h> voi ...
- 对于ElasticSearch与Hadoop是如何互相调用的?
1.在HDFS中,数据是以文件形式保存的,比如JSON: https://blog.csdn.net/napoay/article/details/68945483 2.python读写HDFS,一般 ...
- C#连接mariadb代码及方式
不负责任的说MariaDb和MySQL很多都是通用的,因为来自同一个爹... 和MySQL连接方式差不多 首先配置好你的MariaDb,创建test数据库,在test里创建MyTable表,脚本如下( ...
- 《精通Python设计模式》学习结构型之装饰器模式
这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...
- android练习
package com.example.wang.testapp2; import android.app.AlertDialog; import android.content.DialogInte ...
- USACO 6.1 Cow XOR
Cow XORAdrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All of ...
- LoadRunner参数化时的中文乱码问题
http://blog.sina.com.cn/s/blog_6cf205160100mdxi.html
- 移动端自动化测试(二)之 Appium常用的API(python)函数介绍
上一章节已经介绍了Appium的环境搭建,其实只要掌握了Appium的工作原理,前期的准备工作和安装过程是比较简单的.那么当我们搭建好Appium环境后接下来做些什么呢?通常思路是开始appium的第 ...