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

简介: 设计模式之命令模式(C++)

一、命令模式是什么?

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


      命令模式的优点:


  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,且很难进行命令的组合和撤销操作。


三、总结

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

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

相关文章
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
4月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
47 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
65 2
|
5月前
|
设计模式 JavaScript API
js设计模式【详解】—— 命令模式
js设计模式【详解】—— 命令模式
47 6
|
6月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
7月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
72 2
|
6月前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
30 0
|
6月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
6月前
|
设计模式
设计模式之命令模式
设计模式之命令模式

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    59
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    54
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121