用最简单的例子理解命令模式(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实体类,某个 ...
随机推荐
- linux用户操作
1.用户种类 Linux具有三种用户: 超级管理员root:具有最高权限,UID=0 GID=0伪用户(System Account):(UID=1~499)普通用户(login-Account): ...
- Kubernetes之YAML文件
一.YAML 基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便.它实质上是一种通用的数据串行化格式.后文会说明定义YAML文件创建Pod和创建Deployment. YA ...
- kafka介绍与搭建(单机版)
一.kafka介绍 1.1 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and subscribe to ...
- 2015309南皓芯《Java程序设计》实验一(Java开发环境的熟悉)实验报告
一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹):打开windows下的cmd → 输入cd Code命令进入Code目录 → 输入md 20 ...
- 转:40个Java集合面试问题和答案
转自牛客网:http://mp.weixin.qq.com/s?__biz=MjM5NDYxMzk1Nw==&mid=215319390&idx=1&sn=1ab621bc40 ...
- hadoop 初探之第二篇(杂谈)
NameNode:名称节点,主要功能在于实现保存文件元数据,这些元数据直接保存在内存中,为了保证元数据的持久性,而也会周期性的同步到磁盘上去.磁盘上的数据通常被称为元数据的映像数据 image fil ...
- 最小圆覆盖 gym-102006 I
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- centos7+python3.6+nginx+uwsgi+django2的搭建笔记
公司需上线一套python编写的代码,需要给搭建一套环境 ,本次采用centos7+python3.6+nginx+uwsgi2+django2+mysql5.7的方式来进行搭建 写在部署前 在线上 ...
- Windows 服务器部署 asp.net core
踩坑日记与 Windows 服务器部署 asp.net core 指南. 准备 操作系统:Windows Server 2008 R2 或更高版本 文件: Microsoft Visual C++ 2 ...
- 命令:less
与more的区别 more在man手册中的英文原文是文件熟读过滤器(file perusal filter),其实可以理解为一种文本查看器. 它存在一些缺点: 必须事先加载完整个文件.因此在遇到大文件 ...