|
>>返回《C#常用設(shè)計(jì)模式》
1. 簡介
把方法調(diào)用封裝起來: 通過封裝方法調(diào)用,可以把運(yùn)算塊封裝成形,所以調(diào)用此運(yùn)算對(duì)象不需要知道事情是如何進(jìn)行的。通過封裝方法調(diào)用,可以實(shí)現(xiàn)一些很聰明的事,比如日志記錄。
- 類圖

其中提到的一個(gè)Command,可能為多個(gè)
- 日志的封裝
- Ilogger就是Invoker
- ILogger中的info、warn等方法就是執(zhí)行的Command
- Receiver就是對(duì)應(yīng):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對(duì)象是一個(gè)空對(duì)象,當(dāng)你不想返回一個(gè)有意義的對(duì)象時(shí),空對(duì)象就很有用
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;//這個(gè)字段就是ConcreteCommand中的一個(gè)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();
}
}
|