欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年09月12日 15:59:13   投稿:shichen2014  
這篇文章主要介紹了C#命令模式(Command Pattern),以實例的形式講述了命令模式通過一個指令來控制多個類的多個方法,需要的朋友可以參考下

本文以實例形式講述了C#命令模式的實現(xiàn)方法,分享給大家供大家參考。具體實現(xiàn)方法如下:

現(xiàn)假設(shè)想讓遙控器控制電燈的開關(guān)、電視機的開關(guān)和切換,該如何做?

所有的開、關(guān)、切換都是遙控器發(fā)出的指令,把這些指令統(tǒng)一抽象成一個接口。

public interface IControl
{
    void Execute();
}

把電燈、電視機抽象成類。

public class Tv
{
    public void TurnOn()
    {
      Console.WriteLine("電視機打開了");
    }
    public void TurnOff()
    {
      Console.WriteLine("電視機關(guān)閉了");
    }
    public void SwitchChannel()
    {
      Console.WriteLine("電視機切換頻道");
    }
}
public class Light
{
    public void TunrOn()
    {
      Console.WriteLine("電燈打開了");
    }
    public void TurnOff()
    {
      Console.WriteLine("電燈關(guān)閉了");
    }
}

Tv類的TurnOn(),TurnOff(),SwitchChannel(),Light類的TurnOn(),TurnOff(),這些方法都會通過執(zhí)行IController的Execute方法被觸發(fā)。把每一種動作抽象成類,并實現(xiàn)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();
    }
}

現(xiàn)在,電視機和電燈有了,觸發(fā)各種動作的類有了,遙控器該裝下這些指令(提供裝下指令的方法)并提供方法供客戶端調(diào)用。

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();
    }
}

客戶端的執(zhí)行邏輯大致是:把電視機、電燈準備好,把各種指令準備好,拿出遙控器把各種指令收納其中,最后調(diào)用遙控器的方法執(zhí)行各種指令。

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();
    }
}

總結(jié)命令模式的需求源自想通過一個指令(比如這里IControl的Execute方法)來控制多個類的多個方法,包含了幾個要素:

1、命令:讓類的各種方法抽象成類實現(xiàn)一個接口
2、裝配命令:把各種命令放到一個集合中
3、觸發(fā)命令:提供方法調(diào)用命令集合中的某條命令,讓其執(zhí)行指令

相信本文所述對大家C#程序設(shè)計的學習有一定的幫助借鑒價值。

相關(guān)文章

  • 使用異步方式調(diào)用同步方法(實例詳解)

    使用異步方式調(diào)用同步方法(實例詳解)

    .NET Framework 允許您異步調(diào)用任何方法。為此,應(yīng)定義與您要調(diào)用的方法具有相同簽名的委托;公共語言運行時會自動使用適當?shù)暮灻麨樵撐卸xBeginInvoke和EndInvoke方法
    2013-10-10
  • 在C#中對TCP客戶端的狀態(tài)封裝詳解

    在C#中對TCP客戶端的狀態(tài)封裝詳解

    本篇文章小編為大家介紹,在C#中對TCP客戶端的狀態(tài)封裝詳解,需要的朋友參考下
    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 設(shè)計模式的意義。感興趣的可以了解一下
    2020-07-07
  • 總結(jié)C#動態(tài)調(diào)用WCF接口的兩種方法

    總結(jié)C#動態(tài)調(diào)用WCF接口的兩種方法

    這篇文章給大家總結(jié)了C#動態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對應(yīng)的方式,下面來一起看看。
    2016-09-09
  • winform c#中子窗體關(guān)閉刷新父窗體的實例

    winform c#中子窗體關(guān)閉刷新父窗體的實例

    下面小編就為大家?guī)硪黄獁inform c#中子窗體關(guān)閉刷新父窗體的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • C#序列化與反序列化實例

    C#序列化與反序列化實例

    這篇文章主要介紹了C#序列化與反序列化的實現(xiàn)方法,實例分析了序列化與反序列化的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2015-01-01
  • 利用FlubuCore用C#來寫DevOps腳本的方法詳解

    利用FlubuCore用C#來寫DevOps腳本的方法詳解

    這篇文章主要介紹了利用FlubuCore用C#來寫DevOps腳本的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • C# WORD操作實現(xiàn)代碼

    C# WORD操作實現(xiàn)代碼

    在當前項目開發(fā)過程中,客戶有根據(jù)數(shù)據(jù)庫數(shù)據(jù)生成WORD文檔的需求,在和同事溝通的過程中,找到了兩個解決方案
    2009-04-04
  • 解析如何使用反射調(diào)用類型成員 方法,字段,屬性

    解析如何使用反射調(diào)用類型成員 方法,字段,屬性

    本篇文章是對使用反射調(diào)用類型成員 方法,字段,屬性進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論