命令模式(Command Pattern)
命令模式属于对象的行为型模式。命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,命令模式的实现可以提供命令的撤销和恢复功能。
优点:
- 解除了请求者与实现者之间的耦合,降低了系统的耦合度。
- 对请求排队或记录请求日志,支持撤销操作。
- 可以容易地设计一个组合命令。
- 新命令可以容易地加入到系统中。
缺点:
- 因为针对每一个命令都需要设计一个具体命令类,使用命令模式可能会导致系统有过多的具体命令类。
组成元素:
客户:发出一个具体的命令并确定其接受者。
抽象命令:声明了一个给所有具体命令类实现的抽象接口
具体命令:定义了一个接受者和行为的弱耦合,负责调用接受者的相应方法。
请求者(遥控器):负责调用命令对象执行命令。
接受者(执行者):负责具体行为的执行。
执行者:
/// <summary>
/// 执行者:空调
/// </summary>
public class AirConditioner
{
public void On()
{
Debug.Log("空调开启");
}
public void Off()
{
Debug.Log("空调关闭");
}
public void SetValue(int Value)
{
Debug.Log("空调温度:" + Value);
}
}
/// <summary>
/// 执行者:风扇
/// </summary>
public class Fan
{
public void On()
{
Debug.Log("风扇开启");
}
public void Off()
{
Debug.Log("风扇关闭");
}
public void SetValue(int Value)
{
Debug.Log("风扇档:" + Value);
}
}
抽象命令接口:
/// <summary>
/// 抽象命令接口
/// </summary>
public interface ICommand
{
void On();
void Off();
}
具体命令:
/// <summary>
/// 具体命令:空调
/// </summary>
public class AirConditioner_Command : ICommand
{
AirConditioner airConditioner;
public AirConditioner_Command(AirConditioner airConditioner)
{
this.airConditioner = airConditioner;
}
public void On()
{
airConditioner.On();
airConditioner.SetValue(25);
}
public void Off()
{
airConditioner.Off();
}
}
/// <summary>
/// 具体命令:风扇
/// </summary>
public class Fan_Command : ICommand
{
Fan FanConditioner;
public Fan_Command(Fan FanConditioner)
{
this.FanConditioner = FanConditioner;
}
public void On()
{
FanConditioner.On();
FanConditioner.SetValue(3);
}
public void Off()
{
FanConditioner.Off();
}
}
请求者:
/// <summary>
/// 发令者:遥控器
/// </summary>
public class RemoteControl
{
public ICommand Command;
public void SetControl(ICommand command)
{
Command = command;
}
public void On()
{
Command.On();
}
public void Off()
{
Command.Off();
}
}
运行测试:
void Start()
{
RemoteControl remoteControl = new RemoteControl();//新建空白遥控器
AirConditioner air = new AirConditioner();//获取到执行者空调实体
ICommand air_Command = new AirConditioner_Command(air);//新建 空调控制命令 绑定 空调
remoteControl.SetControl(air_Command);//遥控器载入命令
remoteControl.On();//遥控按下开启按钮
remoteControl.Off();//遥控按下关闭按钮
Fan fan = new Fan(); //获取执行者风扇实体
ICommand fan_Command = new Fan_Command(fan);//新建 风扇控制命令 绑定 风扇
remoteControl.SetControl(fan_Command);//遥控器载入命令
remoteControl.On();//遥控按下开启按钮
remoteControl.Off();//遥控按下关闭按钮
}
结果: