命令模式:将每一个方法都封装成一种命令,调用只需要调用固定的接口就可以,而不需要调用原来的方法。
先定义实体类
public class Light
{
public Light(string name)
{
Name = name;
}
string Name { get; set; }
public void On()
{
Console.WriteLine(Name + " Light On");
}
public void Off()
{
Console.WriteLine(Name + " Light Off");
}
}
public class Radio
{
private readonly string _name;
private readonly string _type;
private readonly int _volume;
public Radio(string name, string type, int volume)
{
_name = name;
_type = type;
_volume = volume;
}
public void On()
{
Console.WriteLine(_name + " Radio On");
}
public void Off()
{
Console.WriteLine(_name + " Radio Off");
}
public void Type()
{
Console.WriteLine(_name + " Radio Type " + _type);
}
public void Volume()
{
Console.WriteLine(_name + " Radio Volume " + _volume);
}
}
再定义一个命令接口
public interface ICommand
{
//执行命令
void Execute();
//撤销命令
void Undo();
}
将实体类的每一个方法都变成一种命令
public class LightOnCommand : ICommand
{
private readonly Light _light;
public LightOnCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.On();
}
public void Undo()
{
_light.Off();
}
}
public class LightOffCommand : ICommand
{
private readonly Light _light;
public LightOffCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.Off();
}
public void Undo()
{
_light.On();
}
}
public class RadioOnCommand : ICommand
{
private readonly Radio _radio;
public RadioOnCommand(Radio radio)
{
_radio = radio;
}
public void Execute()
{
_radio.On();
_radio.Type();
_radio.Volume();
}
public void Undo()
{
_radio.Off();
}
}
public class RadioOffCommand : ICommand
{
private readonly Radio _radio;
public RadioOffCommand(Radio radio)
{
_radio = radio;
}
public void Execute()
{
_radio.Off();
}
public void Undo()
{
_radio.On();
_radio.Type();
_radio.Volume();
}
}
定义一个控制器。改控制器维护了一个OnCommand List和OffCommand List,分别用来存储不同实体的On和Off命令。需要先将命令设置到控制器存储,随后再使用
public class RemoteControl
{
public RemoteControl(int index)
{
_onCommand = new List<ICommand>();
_offCommand = new List<ICommand>();
NoCommand noCommand = new NoCommand();
for (int i = 0; i < index; i++)
{
_onCommand.Add(noCommand);
_offCommand.Add(noCommand);
}
_undoCommand = noCommand;
}
private List<ICommand> _onCommand;
private List<ICommand> _offCommand;
private ICommand _undoCommand;
public void SetCommand(int index, ICommand onCommand, ICommand offCommand)
{
_onCommand[index] = onCommand;
_offCommand[index] = offCommand;
}
public void OnExecute(int index)
{
_onCommand[index].Execute();
_undoCommand = _onCommand[index];
}
public void OffExecute(int index)
{
_offCommand[index].Execute();
_undoCommand = _offCommand[index];
}
public void Undo()
{
_undoCommand.Undo();
}
}