设计模式之命令模式(C++)

news/2024/11/29 4:45:31/

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、命令模式是什么?

       命令模式是一种行为型的软件设计模式,行为请求者通过发起命令,使得行为实现者执行命令要求的行为。通常行为请求者和行为实现者之间是强耦合的,而命令模式能很好地将其解耦。

       命令模式的优点:

  1. 解耦。行为请求者和实现者之间的强耦合关系解除。
  2. 良好扩展性。扩展命令只需要添加一个子类即可,满足开闭原则。
  3. 有效管理命令。如记录、撤销、组合等。

      命令模式的缺点:

  1. 命令增加,子类数量也增多。

二、命令模式

2.1 结构图

       客户端即Main主函数,调用者发起命令至接收者。

 

2.2 代码示例

       场景描述:指挥部向独立团下达冲锋命令,向钢七连下达撤退命令。

//Command.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>using namespace std;// 定义接收者-军队
class Army
{
public:// 构造函数Army(string name) : m_name(name) {}// 获取部队名string getName() {return m_name;}// 行动void fight() {cout << m_name << "发起冲锋!" << endl;}// 撤退void retreat() {cout << m_name << "战略撤退!" << endl;}private:string m_name;
};// 定义命令接口
class Command 
{
public:// 执行virtual void execute() = 0;
};// 定义具体命令-战斗
class FightCommand : public Command
{
public:// 构造函数FightCommand(Army* army) : m_army(army) {cout << "战斗命令部署:" << army->getName() << endl;}// 设置命令执行部队void setArmy(Army* army) {cout << "战斗命令部署:" << army->getName() << endl;m_army = army;}// 执行virtual void execute() {cout << "战斗执行!" << endl;m_army->fight();}private:Army* m_army;
};// 定义具体命令-撤退
class RetreatCommand : public Command
{
public:// 构造函数RetreatCommand(Army* army) : m_army(army) {cout << "撤退命令部署:" << army->getName() << endl;}// 设置命令执行部队void setArmy(Army* army) {cout << "撤退命令部署:" << army->getName() << endl;m_army = army;}// 执行virtual void execute() {cout << "撤退执行!" << endl;m_army->retreat();}private:Army* m_army;
};// 定义调用者-指挥部
class Headquarters
{
public:// 设置命令void setCommand(Command* command) {m_command = command;}// 执行命令void execute_command() {m_command->execute();}private:Command* m_command;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Command.h"using namespace std;int main() 
{// 给两支部队分别部署两条命令Army* army1 = new Army("独立团");Command* command1 = new FightCommand(army1);Army* army2 = new Army("钢七连");Command* command2 = new RetreatCommand(army2);// 指挥部发出命令:独立团冲锋、钢七连撤退Headquarters* headquarters = new Headquarters();headquarters->setCommand(command1);headquarters->execute_command();headquarters->setCommand(command2);headquarters->execute_command();// 清除delete army1;delete command1;delete army2;delete command2;delete headquarters;army1 = nullptr;command1 = nullptr;army2 = nullptr;command2 = nullptr;headquarters = nullptr;return 0;
}

       程序结果如下。

       命令模式的设计,使得指挥部和军队间的关系更加清晰、高效且利于维护和管理。假如没有命令模式,由指挥部直接安排军队,当命令种类增多时,指挥部类中的代码可能会出现膨胀和混乱,比如一堆if else或者switch,且很难进行命令的组合和撤销操作。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对命令模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解命令模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!


http://www.ppmy.cn/news/39699.html

相关文章

侧滑菜单的简单使用

本节给大家带来基础UI控件部分的最后一个控件:DrawerLayout,官方给我们提供的一个侧滑菜单控件,和上一节的ViewPager一样,3.0以后引入,低版本使用它,需要v4兼容包,说到侧滑,相信很多人都用过github上的SlidingMenu,不过好像有两个版本,一个是单独的,另一个需要依赖另…

源码剖析JVM类加载机制

1 前言 我们平常开发中&#xff0c;都会部署开发的项目或者本地运行main函数之类的来启动程序&#xff0c;那么我们项目中的类是如何被加载到JVM的&#xff0c;加载的机制和实现是什么样的&#xff0c;本文给大家简单介绍下。 2 类加载运行全过程 当我们用java命令运行某个类…

【Go进阶】进程和线程、协程的区别

目录 1、进程和线程 2、并发和并行 3、协程 4、对比协程、线程和进程 1、进程和线程

【十分钟学会一个算法】辗转相除法

文章目录题目解析辗转相除法图示代码总结题目 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公因子的数目。 如果 x 可以同时整除 a 和 b &#xff0c;则认为 x 是 a 和 b 的一个公因子 解析 这题本身显然是很简单的&#xff0c;只不过这里面有一个很古老的知识点&#…

作为一个项目经理,这七个项目管理经验你掌握了吗?

作为一名项目经理&#xff0c;我在多年的管理经验中积累了不少经验&#xff0c;今天就来分享一下&#xff1a; 参考模板&#xff1a;http://s.fanruan.com/irhj8​​​​​​​ 1.明确项目目标和范围 在项目开始之前&#xff0c;首先要明确项目的目标和范围。 项目目标是指项…

如何搭建chatGPT4.0模型-国内如何用chatGPT4.0

国内如何用chatGPT4.0 在国内&#xff0c;目前可以通过以下途径使用 OpenAI 的 ChatGPT 4.0&#xff1a; 自己搭建模型&#xff1a;如果您具备一定的技术能力&#xff0c;可以通过下载预训练模型和相关的开发工具包&#xff0c;自行搭建 ChatGPT 4.0 模型。OpenAI提供了相关的…

聊一聊Java中的悲观锁和乐观锁

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录悲观锁&#xff08;Pessimistic Locking&#xff09;悲观锁存的问题&#xff1a;乐观锁乐观锁存在的问题悲观锁和乐观锁的对比总…