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

 更新时间:2014年09月12日 15:59:13   投稿:shichen2014  
这篇文章主要介绍了C#命令模式(Command Pattern),以实例的形式讲述了命令模式通过一个指令来控制多个类的多个方法,需要的朋友可以参考下

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

相关文章

  • 使用异步方式调用同步方法(实例详解)

    使用异步方式调用同步方法(实例详解)

    .NET Framework 允许您异步调用任何方法。为此,应定义与您要调用的方法具有相同签名的委托;公共语言运行时会自动使用适当的签名为该委托定义BeginInvoke和EndInvoke方法
    2013-10-10
  • 在C#中对TCP客户端的状态封装详解

    在C#中对TCP客户端的状态封装详解

    本篇文章小编为大家介绍,在C#中对TCP客户端的状态封装详解,需要的朋友参考下
    2013-04-04
  • C#中 Json 序列化去掉null值的方法

    C#中 Json 序列化去掉null值的方法

    要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉,怎么处理呢?其实方法很简单的,下面就跟随脚本之家小编一起学习C#中 Json 序列化去掉null值的方法吧
    2017-09-09
  • C#中的委托delegate用法的示例详解

    C#中的委托delegate用法的示例详解

    这篇文章主要介绍了C#中的委托用法的示例详解。本章将由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.NET Framework 中的委托和事件、委托中方法异常和超时的处理、委托与异步编程、委托和事件对Observer 设计模式的意义。感兴趣的可以了解一下
    2020-07-07
  • 总结C#动态调用WCF接口的两种方法

    总结C#动态调用WCF接口的两种方法

    这篇文章给大家总结了C#动态调用WCF接口的两种方法,大家可以根据自己的需求选择对应的方式,下面来一起看看。
    2016-09-09
  • winform c#中子窗体关闭刷新父窗体的实例

    winform c#中子窗体关闭刷新父窗体的实例

    下面小编就为大家带来一篇winform c#中子窗体关闭刷新父窗体的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#序列化与反序列化实例

    C#序列化与反序列化实例

    这篇文章主要介绍了C#序列化与反序列化的实现方法,实例分析了序列化与反序列化的原理与实现技巧,需要的朋友可以参考下
    2015-01-01
  • 利用FlubuCore用C#来写DevOps脚本的方法详解

    利用FlubuCore用C#来写DevOps脚本的方法详解

    这篇文章主要介绍了利用FlubuCore用C#来写DevOps脚本的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C# WORD操作实现代码

    C# WORD操作实现代码

    在当前项目开发过程中,客户有根据数据库数据生成WORD文档的需求,在和同事沟通的过程中,找到了两个解决方案
    2009-04-04
  • 解析如何使用反射调用类型成员 方法,字段,属性

    解析如何使用反射调用类型成员 方法,字段,属性

    本篇文章是对使用反射调用类型成员 方法,字段,属性进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论