c#实现命令模式

下面是一个使用C#实现命令模式的示例代码:

csharp 复制代码
using System;
using System.Collections.Generic;

// 命令接口
public interface ICommand
{
    void Execute();
    void Undo();
}

// 具体命令:打开文件
public class OpenFileCommand : ICommand
{
    private FileManager fileManager;

    public OpenFileCommand(FileManager fileManager)
    {
        this.fileManager = fileManager;
    }

    public void Execute()
    {
        fileManager.Open();
    }

    public void Undo()
    {
        fileManager.Close();
    }
}

// 具体命令:保存文件
public class SaveFileCommand : ICommand
{
    private FileManager fileManager;

    public SaveFileCommand(FileManager fileManager)
    {
        this.fileManager = fileManager;
    }

    public void Execute()
    {
        fileManager.Save();
    }

    public void Undo()
    {
        fileManager.UndoSave();
    }
}

// 接收者:文件管理器
public class FileManager
{
    public void Open()
    {
        Console.WriteLine("打开文件");
    }

    public void Close()
    {
        Console.WriteLine("关闭文件");
    }

    public void Save()
    {
        Console.WriteLine("保存文件");
    }

    public void UndoSave()
    {
        Console.WriteLine("撤销保存文件");
    }
}

// 调用者:命令执行器
public class CommandExecutor
{
    private List<ICommand> commands = new List<ICommand>();

    public void AddCommand(ICommand command)
    {
        commands.Add(command);
    }

    public void ExecuteCommands()
    {
        foreach (var command in commands)
        {
            command.Execute();
        }
        commands.Clear();
    }

    public void UndoCommands()
    {
        for (int i = commands.Count - 1; i >= 0; i--)
        {
            commands[i].Undo();
        }
        commands.Clear();
    }
}

// 示例代码
class Program
{
    static void Main(string[] args)
    {
        FileManager fileManager = new FileManager();

        OpenFileCommand openCommand = new OpenFileCommand(fileManager);
        SaveFileCommand saveCommand = new SaveFileCommand(fileManager);

        CommandExecutor executor = new CommandExecutor();
        executor.AddCommand(openCommand);
        executor.AddCommand(saveCommand);

        executor.ExecuteCommands();
        executor.UndoCommands();

        Console.ReadKey();
    }
}

在上述示例中,我们首先定义了一个命令接口ICommand,它包含了Execute和Undo方法。然后我们创建了两个具体的命令类OpenFileCommand和SaveFileCommand,分别表示打开文件和保存文件的命令。

接下来,我们创建了一个接收者FileManager,它是实际执行命令的对象。FileManager中包含了一些具体的操作方法,比如打开文件、关闭文件、保存文件等。

最后,我们创建了一个调用者CommandExecutor,它可以添加和执行命令。调用者将命令添加到命令列表中,并在需要时一起执行或撤销。

在示例代码中,我们创建了一个CommandExecutor对象,添加了打开文件和保存文件的命令。然后我们依次执行这些命令,并在最后撤销执行的命令。运行代码后,你将看到打开文件、关闭文件、保存文件和撤销保存文件的输出。

通过使用命令模式,我们可以将操作封装成命令对象,并在需要时进行执行或撤销。这种方式可以实现请求和执行解耦,同时也方便扩展和管理多个命令。

相关推荐
用户938515635076 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
hez20108 小时前
.NET 11 Runtime Async 详解
c#·.net·.net core
猿长大人10 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
在世修行11 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485
AI人工智能+电脑小能手11 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
NoteStream16 小时前
【C语言基础】分支和循环(上)
c语言·开发语言·c++·经验分享·笔记·算法·c#
今天的砖头有点烫手啊17 小时前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
董员外17 小时前
RAG 系统进化论(十):可运营 RAG,从原型到长期运行的知识系统
人工智能·后端·设计模式
lzhdim18 小时前
C# 通过 Windows API 实现进程内存读写操作
开发语言·windows·c#
-银雾鸢尾-18 小时前
C#中的预处理指令
开发语言·c#