设计模式设计模式重温设计模式 --- 命令模式
Fantasy-ke引言
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。
在命令模式中,有四个主要角色:
- 接收者(Receiver):接收者是实际执行操作的对象。它定义了如何执行与请求相关的操作。
- 命令(Command):命令是将请求封装为对象的接口。它包含执行操作的方法,以及可以撤销操作的方法。
- 调用者(Invoker):调用者是负责将命令发送给接收者的对象。它包含一个命令对象,并在需要执行命令时调用命令的 Execute 方法。
- 客户端(Client):客户端是使用命令模式的对象。它创建具体的命令对象,并将命令对象传递给调用者,从而实现将请求封装为对象的目的。
下面用c#做一个命令模式示例,它实现了一个简单的遥控器:
接收者
1 2 3 4 5 6 7 8 9 10 11 12 13
| class TV { public void TurnOn() { Console.WriteLine("The TV is on."); }
public void TurnOff() { Console.WriteLine("The TV is off."); } }
|
命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| interface ICommand { void Execute(); void Undo(); }
class TVOnCommand : ICommand { private TV tv;
public TVOnCommand(TV tv) { this.tv = tv; }
public void Execute() { tv.TurnOn(); }
public void Undo() { tv.TurnOff(); } }
class TVOffCommand : ICommand { private TV tv;
public TVOffCommand(TV tv) { this.tv = tv; }
public void Execute() { tv.TurnOff(); }
public void Undo() { tv.TurnOn(); } }
|
调用者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class RemoteControl { private ICommand command;
public void SetCommand(ICommand command) { this.command = command; }
public void PressButton() { command.Execute(); }
public void PressUndoButton() { command.Undo(); } }
|
客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| static void Main(string[] args) { TV tv = new TV(); TVOnCommand tvOn = new TVOnCommand(tv); TVOffCommand tvOff = new TVOffCommand(tv);
RemoteControl remoteControl = new RemoteControl(); remoteControl.SetCommand(tvOn); remoteControl.PressButton();
remoteControl.SetCommand(tvOff); remoteControl.PressButton();
remoteControl.PressUndoButton(); }
|
在上面的示例中,遥控器是调用者,电视是接收者,TVOnCommand和TVOffCommand是具体的命令。调用者将命令对象设置到遥控器中,并通过调用PressButton方法来执行命令,通过调用PressUndoButton方法来撤销命令。当具体的命令被执行时,它会调用接收者的方法来完成特定的操作。
结论
命令模式是一种非常实用的设计模式,它可以帮助我们将请求封装成对象,并实现可撤销操作、命令队列、日志和事务等功能,从而简化代码,提高代码的可读性和可维护性。