C#命令模式(Command Pattern)實(shí)例教程
本文以實(shí)例形式講述了C#命令模式的實(shí)現(xiàn)方法,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
現(xiàn)假設(shè)想讓遙控器控制電燈的開(kāi)關(guān)、電視機(jī)的開(kāi)關(guān)和切換,該如何做?
所有的開(kāi)、關(guān)、切換都是遙控器發(fā)出的指令,把這些指令統(tǒng)一抽象成一個(gè)接口。
public interface IControl
{
void Execute();
}
把電燈、電視機(jī)抽象成類(lèi)。
public class Tv
{
public void TurnOn()
{
Console.WriteLine("電視機(jī)打開(kāi)了");
}
public void TurnOff()
{
Console.WriteLine("電視機(jī)關(guān)閉了");
}
public void SwitchChannel()
{
Console.WriteLine("電視機(jī)切換頻道");
}
}
public class Light
{
public void TunrOn()
{
Console.WriteLine("電燈打開(kāi)了");
}
public void TurnOff()
{
Console.WriteLine("電燈關(guān)閉了");
}
}
Tv類(lèi)的TurnOn(),TurnOff(),SwitchChannel(),Light類(lèi)的TurnOn(),TurnOff(),這些方法都會(huì)通過(guò)執(zhí)行IController的Execute方法被觸發(fā)。把每一種動(dòng)作抽象成類(lèi),并實(shí)現(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)在,電視機(jī)和電燈有了,觸發(fā)各種動(dòng)作的類(lèi)有了,遙控器該裝下這些指令(提供裝下指令的方法)并提供方法供客戶(hù)端調(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();
}
}
客戶(hù)端的執(zhí)行邏輯大致是:把電視機(jī)、電燈準(zhǔn)備好,把各種指令準(zhǔn)備好,拿出遙控器把各種指令收納其中,最后調(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é):命令模式的需求源自想通過(guò)一個(gè)指令(比如這里IControl的Execute方法)來(lái)控制多個(gè)類(lèi)的多個(gè)方法,包含了幾個(gè)要素:
1、命令:讓類(lèi)的各種方法抽象成類(lèi)實(shí)現(xiàn)一個(gè)接口
2、裝配命令:把各種命令放到一個(gè)集合中
3、觸發(fā)命令:提供方法調(diào)用命令集合中的某條命令,讓其執(zhí)行指令
相信本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的幫助借鑒價(jià)值。
相關(guān)文章
在C#中對(duì)TCP客戶(hù)端的狀態(tài)封裝詳解
本篇文章小編為大家介紹,在C#中對(duì)TCP客戶(hù)端的狀態(tài)封裝詳解,需要的朋友參考下2013-04-04
總結(jié)C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對(duì)應(yīng)的方式,下面來(lái)一起看看。2016-09-09
winform c#中子窗體關(guān)閉刷新父窗體的實(shí)例
下面小編就為大家?guī)?lái)一篇winform c#中子窗體關(guān)閉刷新父窗體的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
利用FlubuCore用C#來(lái)寫(xiě)DevOps腳本的方法詳解
這篇文章主要介紹了利用FlubuCore用C#來(lái)寫(xiě)DevOps腳本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
解析如何使用反射調(diào)用類(lèi)型成員 方法,字段,屬性
本篇文章是對(duì)使用反射調(diào)用類(lèi)型成員 方法,字段,屬性進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

