编辑
2025-09-28
C#
00

目录

摘要
正文
结构
命令模式的应用场景
菜单操作
播放器控制
任务调度
例子
总结

摘要

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户端进行参数化。这种模式可以将请求的发送者与接收者解耦,并且可以轻松地添加新的命令。

正文

结构

命令模式由以下几个角色组成:

  • 命令(Command):声明了一个执行操作的接口,通常包含一个Execute()方法。
  • 具体命令(Concrete Command):实现了命令接口,持有一个接收者对象,并实现了Execute()方法。
  • 接收者(Receiver):执行命令的对象。
  • 调用者(Invoker):持有一个命令对象,并在需要时调用命令的Execute()方法。
  • 客户端(Client):创建命令对象并将其分配给调用者。

以下是命令模式的结构示意图:

image.png

命令模式的应用场景

命令模式适用于以下情况:

  • 当需要将请求的发送者与接收者解耦时,可以使用命令模式。
  • 当需要在不同的时间指定、排列和执行请求时,可以使用命令模式。
  • 当需要支持撤销操作时,可以使用命令模式。

以下是一些可能的应用场景:

菜单操作

在一个图形用户界面(GUI)应用程序中,可以使用命令模式来处理菜单操作。每个菜单项可以对应一个具体的命令,当用户点击菜单项时,调用者会执行相应的命令。

例如,一个文本编辑器的菜单中有一个"复制"菜单项,可以创建一个CopyCommand类来实现复制操作,然后将该命令对象分配给调用者。

播放器控制

在一个音乐播放器应用程序中,可以使用命令模式来控制播放器的操作。例如,可以创建一个PlayCommand类来实现播放操作,然后将该命令对象分配给调用者。

任务调度

在一个任务调度系统中,可以使用命令模式来执行定时任务。每个定时任务可以对应一个具体的命令,当任务触发时,调用者会执行相应的命令。

例子

假设有一个简单的遥控器,上面有几个按钮,分别对应不同的电器设备。我们可以使用命令模式来实现这个遥控器。

首先,我们需要定义一个命令接口ICommand,其中包含一个Execute()方法:

C#
public interface ICommand { void Execute(); }

我们需要定义一个接收者类Light,它包含打开和关闭灯的具体实现:

C#
public class Light { public void On() { Console.WriteLine("Light is on"); } public void Off() { Console.WriteLine("Light is off"); } }

然后,我们可以创建具体的命令类,例如LightOnCommandLightOffCommand,它们分别对应打开和关闭灯的操作。这些具体命令类需要实现ICommand接口,并在Execute()方法中实现具体的操作逻辑:

C#
public class LightOnCommand : ICommand { private Light _light; public LightOnCommand(Light light) { _light = light; } public void Execute() { _light.On(); } }
C#
public class LightOffCommand : ICommand { private Light _light; public LightOffCommand(Light light) { _light = light; } public void Execute() { _light.Off(); } }

我们需要创建一个调用者类RemoteControl,它持有一个命令对象,并在需要时调用命令的Execute()方法:

C#
public class RemoteControl { private ICommand _command; public void SetCommand(ICommand command) { _command = command; } public void PressButton() { _command.Execute(); } }

使用命令模式来控制灯的开关

C#
static void Main(string[] args) { var light = new Light(); var lightOnCommand = new LightOnCommand(light); var lightOffCommand = new LightOffCommand(light); var remoteControl = new RemoteControl(); remoteControl.SetCommand(lightOnCommand); remoteControl.PressButton(); // 打开灯 remoteControl.SetCommand(lightOffCommand); remoteControl.PressButton(); // 关闭灯 }

image.png

总结

命令模式是一种将请求封装成对象的设计模式,它可以将请求的发送者与接收者解耦,并且可以轻松地添加新的命令。通过使用命令模式,我们可以实现更灵活、可扩展和可维护的代码。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!