用最简单的例子理解命令模式(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实体类,某个 ...
 
随机推荐
- HDU 1054 Strategic Game(最小路径覆盖)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题目大意:给你一棵树,选取树上最少的节点使得可以覆盖整棵树. 解题思路: 首先树肯定是二分图,因 ...
 - Centos之压缩和解压缩命令
			
常用压缩格式:.zip .gz .bz2 常用压缩格式:.tar.gz .tar.bz2 zip格式压缩 zip压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 [root@ ...
 - (六)MyBatis杂项
			
第一节:处理CLOB.BLOB类型数据 第二节:传入多个输入参数 第三节:MyBatis分页 1,逻辑分页 2,物理分页 MyBatis默认情况下,MyBatis启用一级缓存,即同一个SqlSessi ...
 - MySQL学习笔记:floor、round —— 取整
			
在MySQL中做数值处理,需要取整或者四舍五入. floor:函数只返回整数部分,小数部分舍弃: round:函数四舍五入: END 2018-05-29 11:31:22
 - CTF常用python库PwnTools的使用学习
			
之前主要是使用zio库,对pwntools的了解仅限于DynELF,以为zio就可以取代pwntools.后来发现pwntools有很多的高级用法都不曾听说过,这次学习一下用法,希望可以在以后的exp ...
 - MATLAB读写Excel文件中的数据
			
读取: %读取filename文件中指定表的数据,存入dataRead矩阵中 dataRead=xlsread('filename.xls',sheet); 写入: %将矩阵dataWrite中的数据 ...
 - ZooKeeper实践:(1)集群管理
			
前言: 随着业务的扩大,用户的增多,访问量的增加,单机模式已经不能支撑,从而出现了从单机模式->垂直应用模式->集群模式,集群模式诞生了,伴随着一堆问题也油然而生,Master怎么选举,机 ...
 - 【BZOJ】4671: 异或图
			
题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...
 - 顺序线性表之大整数求和C++实现
			
顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...
 - [BZOJ4567][SCOI2016]背单词(Trie+贪心)
			
1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某 ...