コマンド モードのデザイン モード (C++)

著者: Zhai Tianbao Steven
著作権表示: 著作権は著者に帰属します. 商用転載の場合は、著者に連絡して許可を得てください. 非商用転載の場合は、出典を示してください.

1. コマンドモードとは?

       コマンドモードは動作ソフトウェア設計モードであり、動作要求者がコマンドを起動し、動作実装者にコマンドが要求する動作を実行させる。通常、動作の要求者と動作の実装者の間には強い結合があり、コマンド モードはそれをうまく切り離すことができます。

       コマンドモードの利点:

  1. デカップリング。行動要求者と実施者の強い結合関係が解放されます。
  2. 優れたスケーラビリティ。コマンドを拡張するには、開閉の原則を満たすサブクラスを追加するだけです。
  3. コマンドを効果的に管理します。記録、取り消し、結合など。

      コマンド モードの欠点:

  1. コマンドが増えると、サブクラスの数も増えます。

2.コマンドモード

2.1 構造図

       クライアントはメイン関数であり、呼び出し元は受信者にコマンドを送信します。

 

2.2 コード例

       シーンの説明: 本部は独立連隊に突撃命令を発し、第 7 鉄鋼会社に退却命令を発しました。

//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やスイッチの束などで混乱し、組み合わせが難しくなる可能性があるコマンドをキャンセルします。

3. まとめ

       より一般的な単語と直感的なコード ルーチンを使用して、コマンド モードの理解を表現するために最善を尽くします. 思慮に欠けるものがいくつかあるかもしれません. 異なる意見がある場合は、コメント領域にようこそ! 私の例が、コマンド パターンをよりよく理解するのに役立つことを願っています。

       記事がお役に立てば、いいねでお知らせください。とても嬉しいです〜さあ!

おすすめ

転載: blog.csdn.net/zhaitianbao/article/details/130063878