C#命令模式(Command Pattern)实例教程

所属分类: 软件编程 / C#教程 阅读数: 68
收藏 0 赞 0 分享

本文以实例形式讲述了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#程序设计的学习有一定的帮助借鉴价值。

更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多