Command 命令模式
1. 简介
把方法调用封装起来: 通过封装方法调用,可以把运算块封装成形,所以调用此运算对象不需要知道事情是如何进行的。通过封装方法调用,可以实现一些很聪明的事,比如日志记录。
- 类图
其中提到的一个Command,可能为多个 - 日志的封装
- Ilogger就是Invoker
- ILogger中的info、warn等方法就是执行的Command
- Receiver就是对应:FileWriter、DBWriter
2. 示例
//遥控器 Invoker
public class RemoteControl
{
private readonly ICommand _onCommand;
private readonly ICommand _offCommand;
public RemoteControl()
{
var noCommand = new NoCommand();
_onCommands = noCommand;
_offCommands = noCommand;
}
public void SetCommand(ICommand onCommand, ICommand offCommand)
{
_onCommand = onCommand;
_offCommand = offCommand;
}
public void OnButtonWasPushed()
{
_onCommand.Execute();
}
public void OffButtonWasPushed()
{
_offCommand.Execute();
}
}
//Command
public interface ICommand
{
void Execute();
void Undo();
}
//NoCommand对象是一个空对象,当你不想返回一个有意义的对象时,空对象就很有用
public class NoCommand : ICommand
{
public void Execute()
{
Console.WriteLine("No command was executed!");
}
public void Undo()
{
Console.WriteLine("No command was executed!");
}
}
//ConcreteCommand
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 LightOnCommand : ICommand
{
private readonly Light _light;//这个字段就是ConcreteCommand中的一个Receiver,多用组合少用继承!
public LightOnCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.On();
}
public void Undo()
{
_light.Off();
}
}
//Receiver
public class Light
{
public void On()
{
Console.WriteLine("light's on");
}
public void Off()
{
Console.WriteLine("light's off");
}
}
class Program
{
static void Main(string[] args)
{
var control = new RemoteControl();
var light = new Light();
var lightOnCommand = new LightOnCommand(light);
var lightOffCommand = new LightOffCommand(light);
control.SetCommand(lightOnCommand, lightOffCommand);
control.OnButtonWasPushed();
Console.ReadKey();
}
}
如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者: 大师兄石头
来源: https://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!