重温设计模式 --- 命令模式
引言
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。
在命令模式中,有四个主要角色:
- 接收者(Receiver):接收者是实际执行操作的对象。它定义了如何执行与请求相关的操作。
- 命令(Command):命令是将请求封装为对象的接口。它包含执行操作的方法,以及可以撤销操作的方法。
- 调用者(Invoker):调用者是负责将命令发送给接收者的对象。它包含一个命令对象,并在需要执行命令时调用命令的 Execute 方法。
- 客户端(Client):客户端是使用命令模式的对象。它创建具体的命令对象,并将命令对象传递给调用者,从而实现将请求封装为对象的目的。
下面用c#做一个命令模式示例,它实现了一个简单的遥控器:
接收者
// 接收者:电视
class TV
{
public void TurnOn()
{
Console.WriteLine("The TV is on.");
}
public void TurnOff()
{
Console.WriteLine("The TV is off.");
}
}
命令
// 命令接口
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();
}
}
调用者
// 调用者:遥控器
class RemoteControl
{
private ICommand command;
public void SetCommand(ICommand command)
{
this.command = command;
}
public void PressButton()
{
command.Execute();
}
public void PressUndoButton()
{
command.Undo();
}
}
客户端
// 客户端代码
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(); // 输出:The TV is on.
remoteControl.SetCommand(tvOff);
remoteControl.PressButton(); // 输出:The TV is off.
remoteControl.PressUndoButton(); // 输出:The TV is on.
}
在上面的示例中,遥控器是调用者,电视是接收者,TVOnCommand
和TVOffCommand
是具体的命令。调用者将命令对象设置到遥控器中,并通过调用PressButton
方法来执行命令,通过调用PressUndoButton
方法来撤销命令。当具体的命令被执行时,它会调用接收者的方法来完成特定的操作。
结论
命令模式是一种非常实用的设计模式,它可以帮助我们将请求封装成对象,并实现可撤销操作、命令队列、日志和事务等功能,从而简化代码,提高代码的可读性和可维护性。
作者: Niuery Daily
出处: https://www.cnblogs.com/pandefu/>
邮箱: defu_pan@163.com
关于作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控件库,多线程
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接,否则保留追究法律责任的权利。 如有问题, 可邮件咨询。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!