美文网首页
命令模式

命令模式

作者: 钟离惜 | 来源:发表于2020-10-31 23:37 被阅读0次

命令模式属于行为变化模式。
命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
该模式主要是为了隔离请求和实际执行者之间解除。就是解耦和,所有的请求统一有一个类负责,而该类负责管理这些请求(添加请求、撤销请求之类的)。上图种Invoker负责接受和管理各种命令。然后有Invoker统一像Receiver发起请求。所有类型的请求都封装在Command中了。这样做,发起命令者根本不用知道是谁来做这个事情的。比如餐厅点餐,客人无论是点餐还是撤销还是有特殊要求都只用跟服务员说就可以了,而并不用和实际的做菜的人说。

命令模式和代理模式的区别:
从使用角度上感觉这两种模式实现的功能很像。但从具体实现上来讲,命令模式侧重点在于对命令的封装和对命令的管理,在于对命令的发起者和命令的世界操作者之间解耦和。属于行为模式的一种。而代理模式只是实现了实际可被访问功能的接口,代理模式并没有对命令或请求的管理。

命令模式和外观模式的区别:
命令模式和代理模式的UML类图也是很相似的。从宏观的角度上理解它们之间实现的功能也非常相似。不过外观模式更注重的是对子系统功能的封装,它们之间的外观类和子系统中类的接口并不一样。命令模式并没有对Receiver功能的封装,命令模式侧重的是命令和命令执行者之间的解耦和。不过这两种模式一起使用则非常方便。命令模式的中的Receiver可以是一个Facade,是一个子系统上的一个接口。而一个Facade内部的各个接口实现的则也可以封装成为一各个Command等。

示例代码

// CommandModel.h文件
#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 烤肉师傅
class BarbecueMaster
{
public:
    void MakeMutton()
    {
        std::cout << "烤羊腿喽" << std::endl;
    }
    void MakeChiken()
    {
        std::cout << "烤鸡肉喽" << std::endl;
    }
};
// 命令类
class Command
{
protected:
    BarbecueMaster * m_master;
public:
    Command(BarbecueMaster * p)
    {
        m_master = p;
    }
    virtual void executeCmd() = 0;
};

class CommandMutton : public Command
{
public:
    CommandMutton(BarbecueMaster * p) : Command(p) {}
    void executeCmd()
    {
        m_master->MakeMutton();
    }
};

class CommandChiken : public Command
{
public:
    CommandChiken(BarbecueMaster * p) : Command(p) {}
    void executeCmd()
    {
        m_master->MakeChiken();
    }
};
// 服务员
class Waiter
{
private:
    std::vector<Command *> m_vec;
public:
    ~Waiter()
    {
        for (auto it = m_vec.begin(); it != m_vec.end(); it++)
        {
            delete(*it);
        }
        m_vec.clear();
    }
    void add(Command * p)
    {
        m_vec.push_back(p);
    }
    void remove(Command * p)
    {
        auto it = find(m_vec.begin(), m_vec.end(), p);
        if (it != m_vec.end())
            m_vec.erase(it);
    }
    void submitCmd()
    {
        for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
        {
            (*it)->executeCmd();
        }
    }
};


int main()
{
    using namespace std;
    // 命令模式
    Waiter * pWaiter = new Waiter();
    BarbecueMaster * pMaster = new BarbecueMaster();
    pWaiter->add(new CommandChiken(pMaster));
    pWaiter->add(new CommandMutton(pMaster));
    pWaiter->submitCmd();
    delete pMaster;
    delete pWaiter;
    return 0;
}

转载文章
设计模式之命令模式(C++)

相关文章

  • 12.vim的使用技巧

    命令模式 、命令行模式、编辑模式: INSERT 首次进入文件: 命令模式输入: 表示 命令行模式出现...

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

  • 终端操作文件

    VIM 模式切换从命令模式->编辑模式:i,a,o,I,A,O从编辑模式->命令模式:ESC从命令模式->末行模式...

  • vim 操作 && Mac 配置本地Apache

    一、vim 的基本命令操作 vim 的模式: 编辑模式 ,命令模式 编辑模式: 命令模式:可以通过命令 最重要的命...

  • Vim高效编辑器

    Vim程序员高效编辑器 命令模式,输入模式,底线命令模式 默认进入vim就是命令模式,输入i变为输入模式 命令模式...

  • Command模式

    命令模式(Command) 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Tran...

  • 设计模式详解——命令模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之命令模式。 一、命令模式的概念 命令模式...

  • Vi编辑器

    命令模式 文本输入模式 末行模式。 插入模式 移动光标: 删除命令: 撤销命令: 重复命令 文本行移动: 复制粘贴...

  • JavaScript设计模式七(命令模式)

    JavaScript设计模式七(命令模式) 定义: 命令模式是最简单和优雅的模式之一,命令模式中的命令指的是一个执...

  • Cisco 路由器配置命令大全(二)

    (1)模式转换命令 用户模式----特权模式,使用命令"enable"特权模式----全局配置模式,使用命令"co...

网友评论

      本文标题:命令模式

      本文链接:https://www.haomeiwen.com/subject/hoczmktx.html