前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >设计模式--命令模式

设计模式--命令模式

原创
作者头像
软件架构师Michael
发布2023-07-18 19:58:31
发布2023-07-18 19:58:31
26300
代码可运行
举报
运行总次数:0
代码可运行

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,以便可以将不同的请求参数化,队列化或记录日志,以及支持可撤销操作。在命令模式中,包含一个命令接口和具体的命令实现类,以及一个调用者(invoker)类和一个接收者(receiver)类。调用者通过调用接口中的方法执行命令,发起请求,接收者则负责实际执行命令。这种设计模式将调用者和接收者解耦,使得系统更加灵活。

具体来说,命令模式中包含以下角色:

  • Command:定义一个命令接口,通常包含一个execute()方法,用于执行命令操作。
  • ConcreteCommand:继承或实现 Command 接口,并实现execute()方法,执行具体的命令操作。
  • Receiver:定义接收者,负责实际执行命令操作。
  • Invoker:调用者角色,负责调用具体的命令执行。它包含一个指向 Command 接口的引用,用于发起命令请求。

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

代码语言:javascript
代码运行次数:0
复制
using System;

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

// 具体命令类A
public class ConcreteCommandA : ICommand
{
    private Receiver receiver;

    public ConcreteCommandA(Receiver receiver)
    {
        this.receiver = receiver;
    }

    public void Execute()
    {
        receiver.Action("ConcreteCommandA");
    }
}

// 具体命令类B
public class ConcreteCommandB : ICommand
{
    private Receiver receiver;

    public ConcreteCommandB(Receiver receiver)
    {
        this.receiver = receiver;
    }

    public void Execute()
    {
        receiver.Action("ConcreteCommandB");
    }
}

// 接收者角色
public class Receiver
{
    public void Action(string commandName)
    {
        Console.WriteLine("Receiver execute " + commandName);
    }
}

// 调用者角色
public class Invoker
{
    private ICommand command;

    // 设置命令
    public void SetCommand(ICommand command)
    {
        this.command = command;
    }

    // 执行命令
    public void ExecuteCommand()
    {
        command.Execute();
    }
}

// 客户端测试
public class Client
{
    public static void Main()
    {
        Receiver receiver = new Receiver();
        ConcreteCommandA commandA = new ConcreteCommandA(receiver);
        ConcreteCommandB commandB = new ConcreteCommandB(receiver);

        Invoker invoker = new Invoker();

        invoker.SetCommand(commandA);
        invoker.ExecuteCommand();

        invoker.SetCommand(commandB);
        invoker.ExecuteCommand();
    }
}

【代码分析】

在上面的示例中,ICommand接口定义了命令执行的方法Execute()ConcreteCommandAConcreteCommandB是两个具体的命令类,它们继承或实现了ICommand接口,并实现了命令执行的具体操作。Receiver是接收者类,它负责实际执行命令操作。Invoker类是调用者类,它包含了一个ICommand接口类型的成员变量,可以接收不同的具体命令对象。当需要执行操作时,调用ExecuteCommand()方法,实现对命令的调用执行。

在客户端代码中,通过创建具体的命令对象并将其传递给调用者类,来执行不同的命令,实现了命令之间的解耦。

【小结】

日拱一卒,终有所获。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档