C#命令模式(Command Pattern)实例教程
本文以实例形式讲述了C#命令模式的实现方法,分享给大家供大家参考。具体实现方法如下:
现假设想让遥控器控制电灯的开关、电视机的开关和切换,该如何做?
所有的开、关、切换都是遥控器发出的指令,把这些指令统一抽象成一个接口。
publicinterfaceIControl
{
voidExecute();
}
把电灯、电视机抽象成类。
publicclassTv
{
publicvoidTurnOn()
{
Console.WriteLine("电视机打开了");
}
publicvoidTurnOff()
{
Console.WriteLine("电视机关闭了");
}
publicvoidSwitchChannel()
{
Console.WriteLine("电视机切换频道");
}
}
publicclassLight
{
publicvoidTunrOn()
{
Console.WriteLine("电灯打开了");
}
publicvoidTurnOff()
{
Console.WriteLine("电灯关闭了");
}
}
Tv类的TurnOn(),TurnOff(),SwitchChannel(),Light类的TurnOn(),TurnOff(),这些方法都会通过执行IController的Execute方法被触发。把每一种动作抽象成类,并实现IControl接口。
publicclassLighOn:IControl
{
privateLight_light;
publicLighOn(Lightlight)
{
_light=light;
}
publicvoidExecute()
{
_light.TunrOn();
}
}
publicclassLightOff:IControl
{
privateLight_light;
publicLightOff(Lightlight)
{
_light=light;
}
publicvoidExecute()
{
_light.TurnOff();
}
}
publicclassTvOn:IControl
{
privateTv_tv;
publicTvOn(Tvtv)
{
_tv=tv;
}
publicvoidExecute()
{
_tv.TurnOn();
}
}
publicclassTvOff:IControl
{
privateTv_tv;
publicTvOff(Tvtv)
{
_tv=tv;
}
publicvoidExecute()
{
_tv.TurnOff();
}
}
publicclassTvSwitch:IControl
{
privateTv_tv;
publicTvSwitch(Tvtv)
{
_tv=tv;
}
publicvoidExecute()
{
_tv.SwitchChannel();
}
}
现在,电视机和电灯有了,触发各种动作的类有了,遥控器该装下这些指令(提供装下指令的方法)并提供方法供客户端调用。
publicclassRemoteControl
{
privateIList<IControl>onCommands=newList<IControl>();
privateIList<IControl>offCommands=newList<IControl>();
privateIList<IControl>switchCommands=newList<IControl>();
publicvoidAddOnCommand(IControlcontrol)
{
onCommands.Add(control);
}
publicvoidAddOffCommand(IControlcontrol)
{
offCommands.Add(control);
}
publicvoidAddSwitchCommand(IControlcontrol)
{
switchCommands.Add(control);
}
publicvoidPressOnButton(intnumber)
{
onCommands[number].Execute();
}
publicvoidPressOffButton(intnumber)
{
offCommands[number].Execute();
}
publicvoidPressSwitchButton(intnumber)
{
switchCommands[number].Execute();
}
}
客户端的执行逻辑大致是:把电视机、电灯准备好,把各种指令准备好,拿出遥控器把各种指令收纳其中,最后调用遥控器的方法执行各种指令。
classProgram
{
staticvoidMain(string[]args)
{
//命令的接收方
Lightlight=newLight();
Tvtv=newTv();
//各种命令
LighOnturnLightOn=newLighOn(light);
LightOffturnLightOff=newLightOff(light);
TvOnturnTvOn=newTvOn(tv);
TvOffturnTvOff=newTvOff(tv);
TvSwitchswitchTv=newTvSwitch(tv);
//RemoteConroller组装命令
RemoteControlcontrol=newRemoteControl();
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#程序设计的学习有一定的帮助借鉴价值。