C#命令模式(Command Pattern)实例教程
作者:shichen2014 发布时间:2023-06-13 00:15:48
标签:C#,命令,模式
本文以实例形式讲述了C#命令模式的实现方法,分享给大家供大家参考。具体实现方法如下:
现假设想让遥控器控制电灯的开关、电视机的开关和切换,该如何做?
所有的开、关、切换都是遥控器发出的指令,把这些指令统一抽象成一个接口。
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、触发命令:提供方法调用命令集合中的某条命令,让其执行指令
相信本文所述对大家C#程序设计的学习有一定的帮助借鉴价值。


猜你喜欢
- 看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下, 首先来了解下Lrc文件 时间
- class Dirctonary { &nbs
- 前言:在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天
- 贪婪量词:先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么 
- 大多数的B2C商城项目都会有限时活动,当用户下单后都会有支付超时时间,当订单超时后订单的状态就会自动变成已取消 ,这个功能的实现
- 本文实例讲述了C#基于OLEDB获取Excel文件表结构信息的方法。分享给大家供大家参考,具体如下:这个问题来自论坛提问,同理可以获得acc
- 最近在做项目时,需要进行音频文件的即时播放,并且要求同时播放多条语音,之前C#程序中语音播放一直使用System.Media类库的Sound
- 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据比如json数据如下:{responseHeader:{status:0
- 本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能。分享给大家供大家参考,具体如下:工具类...public
- 本文实例讲述了Java泛型定义与用法。分享给大家供大家参考,具体如下:1. 泛型的由来先看如下代码:import java.util.Lis
- 一、注解(annotations)列表@SpringBootApplication:包含了@ComponentScan、@Configura
- 线程组构造方法我们看这个线程组,线程组名字是system,设置优先级,然后指定父线程是空,可以看出这个是根线程组,这个方法是私有的,不是给我
- 前言作为一个新手,最近在学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站。第一次搞爬虫,涉及到了网
- 多线程下@Resource注入为null前情叙述记录以下这个坑,我的情况大致是这样的,我在用webmagic写爬虫,在类中通过@Resoou
- 本实例是为了实现在管理后台实现微信菜单的添加删除管理。1、首先我们需要新建一个数据库表用于存放menu菜单项可包含的字段有id、父类id、n
- Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了:1、传统的ViewPager实现2、Fr
- 本文实例为大家分享了PhotoView实现图片多点触控效果展示的具体代码,供大家参考,具体内容如下效果:点击后能够自由缩放、平移;添加依赖:
- 一、引言在刷算法的时候经常需要对数组进行排序,第一反应就是直接使用java.util包下的Arrays.sort()方法直接排序。但在刷算法
- 后台控制层: public static final String HEAD_IMG_DIR = "D:/upload/&quo
- 本文实例为大家分享了新闻列表分页查询的java代码,供大家参考,具体内容如下package com.ibeifeng.test;//创建新闻