热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

命令模式(C++实现)

(本博客旨在个人总结回顾)1、详情:命令模式:将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化

(本博客旨在个人总结回顾)


1、详情:

命令模式:将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

说明:

优点:①降低了系统耦合度。 ②新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:认为是命令的地方都可以使用命令模式,比如: ①GUI 中每一个按钮都是一条命令。 ②模拟 CMD。

注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。


2.1、UML类图:

 


2.2、例子源码

stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//#pragma once#include "targetver.h"#include
#include #include
using namespace std;// TODO: 在此处引用程序需要的其他头文件

Receiver.h

#pragma onceclass Receiver
{
public:Receiver();~Receiver();public:void Operation(int nState);
};

Receiver.cpp

#include "stdafx.h"
#include "Receiver.h"Receiver::Receiver()
{
}Receiver::~Receiver()
{
}void Receiver::Operation(int nState)
{cout <<"执行请求:" <}

Command.h

#pragma once
#include "Receiver.h"class Command
{
public:Command(Receiver* pReceiver, int nState);virtual ~Command();public:virtual void Execute() &#61; 0;protected:Receiver* m_pReceiver;int m_nState;
};

Command.cpp

#include "stdafx.h"
#include "Command.h"Command::Command(Receiver* pReceiver, int nState): m_pReceiver(pReceiver), m_nState(nState)
{
}Command::~Command()
{
}

CommandX.h

#pragma once
#include "Command.h"class CommandX :public Command
{
public:CommandX(Receiver* pReceiver, int nState);~CommandX();public:void Execute();
};

CommandX.cpp

#include "stdafx.h"
#include "CommandX.h"CommandX::CommandX(Receiver* pReceiver, int nState) : Command(pReceiver, nState)
{
}CommandX::~CommandX()
{
}void CommandX::Execute()
{m_pReceiver->Operation(m_nState);
}

Sender.h

#pragma once
#include "Command.h"class Sender
{
public:Sender();~Sender();public:void AddCommand(Command* pCommand);void RemoveCommand(Command* pCommand);void ExecuteCommand();private:std::list m_listCommand;
};

Sender.cpp

#include "stdafx.h"
#include "Sender.h"Sender::Sender()
{
}Sender::~Sender()
{for (std::list::iterator it &#61; m_listCommand.begin(); it !&#61; m_listCommand.end(); it&#43;&#43;){delete *it;}m_listCommand.clear();
}void Sender::AddCommand(Command* pCommand)
{m_listCommand.push_back(pCommand);
}void Sender::ExecuteCommand()
{for (std::list::iterator it &#61; m_listCommand.begin(); it !&#61; m_listCommand.end(); it&#43;&#43;){(*it)->Execute();}
}void Sender::RemoveCommand(Command* pCommand)
{for (std::list::iterator it &#61; m_listCommand.begin(); it !&#61; m_listCommand.end(); it&#43;&#43;){if (*it &#61;&#61; pCommand){delete *it;m_listCommand.erase(it);break;}}
}

调用代码

CommandPatternMemo.cpp

// CommandPatternMemo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "Receiver.h"
#include "CommandX.h"
#include "Sender.h"int _tmain(int argc, _TCHAR* argv[])
{Receiver* pReceiver &#61; new Receiver();Command* pCommand &#61; new CommandX(pReceiver, 1);Sender sender;sender.AddCommand(pCommand);pCommand &#61; new CommandX(pReceiver, 2);sender.AddCommand(pCommand);sender.RemoveCommand(pCommand);pCommand &#61; new CommandX(pReceiver, 3);sender.AddCommand(pCommand);pCommand &#61; new CommandX(pReceiver, 4);sender.AddCommand(pCommand);sender.ExecuteCommand();delete pReceiver;pReceiver &#61; NULL;system("pause");return 0;
}

2.3、运行结果&#xff1a;


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
author-avatar
davidwzw2009413
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有