cpp: Command Pattern

25 篇文章 0 订阅
/*****************************************************************//**
 * \file   Gold.h
 * \brief   Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   27 May 2023
 *********************************************************************/
 
#pragma once
#ifndef GOLD_H
#define GOLD_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
 
    /// <summary>
    /// 类
    /// </summary>
    class Gold
    {
 
    public:
        /// <summary>
        /// 制作金项链
        /// </summary>
        void GoldNecklace()
        {
            cout << "制作一条金项链" << endl;
        }
 
        /// <summary>
        /// 制作黄金耳环
        /// </summary>
        void GoldEarring()
        {
            cout << "制作一对黄金耳环" << endl;
        }
        //做其他各种黄金鉓品......略
 
    };
}
#endif
 
 
/*****************************************************************//**
 * \file   Command.h
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 *  涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   27 May 2023
 *********************************************************************/
#pragma once
#ifndef COMMAND_H
#define COMMAND_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
 
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    /// 制作各种黄金饰品对应的抽象类
    /// </summary>
    class Command
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="pgold"></param>
        Command(Gold* pgold)
        {
            mPGold = pgold;
        }
        /// <summary>
        /// 做父类时析构函数应该为虚函数
        /// </summary>
        virtual ~Command()
        {
            if (mPGold != nullptr)
            {
                //delete mPGold;
                mPGold = nullptr;
            }
        }
        /// <summary>
        /// 执行
        /// </summary>
        virtual void Execute() = 0;
    protected:
        /// <summary>
        /// 子类需要访问
        /// </summary>
        Gold* mPGold; //
 
 
    };
 
}
#endif
 
 
/*****************************************************************//**
 * \file   CommandNecklace.h
 * \brief   Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   27 May 2023
 *********************************************************************/
#pragma once
#ifndef COMMANDNECKLACE_H
#define COMMANDNECKLACE_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include "Gold.h"
#include "Command.h"
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    /// 制作黄金项链命令
    /// </summary>
    class CommandNecklace:public Command
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="pgold"></param>
        CommandNecklace(Gold* pgold) :Command(pgold) {}
        /// <summary>
        /// 执行
        /// </summary>
        virtual void Execute()
        {
            mPGold->GoldNecklace();
        }
 
    };
}
 
#endif
 
/*****************************************************************//**
 * \file   CommandEarring.h
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   27 May 2023
 *********************************************************************/
#pragma once
#ifndef COMMANDEARRING_H
#define COMMANDEARRING_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include "Gold.h"
#include "Command.h"
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    /// 制作黄金耳环命令
    /// </summary>
    class CommandEarring:public Command
    {
 
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="pgold"></param>
        CommandEarring(Gold* pgold) :Command(pgold) {}
        /// <summary>
        /// 执行
        /// </summary>
        virtual void Execute()
        {
            mPGold->GoldEarring();
        }
 
 
    };
 
}
#endif
 
/*****************************************************************//**
 * \file   Craftsman.h
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 *
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef CRAFTSMAN_H
#define CRAFTSMAN_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    /// 工匠
    /// </summary>
    class Craftsman
    {
    public:
         
         
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="pcommand"></param>
        void AddCommand(Command* pcommand)
        {
            mCommlist.push_back(pcommand);
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="pcommand"></param>
        void DelCommand(Command* pcommand)
        {
            mCommlist.remove(pcommand);
        }
 
        /// <summary>
        /// 收到多个制作BOM单,按顺序制作
        /// </summary>
        void Notify()
        {
         
            for (auto iter = mCommlist.begin(); iter != mCommlist.end(); ++iter)
            {
                (*iter)->Execute();
            }
        }
    private:
         
         
        /// <summary>
        /// 多个制作BOM单列表
        /// </summary>
        std::list<Command*> mCommlist;
 
 
    };
 
}
 
#endif
 
/*****************************************************************//**
 * \file   TraineeCraftsman.h
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef CRAFTSMAN_H
#define CRAFTSMAN_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    /// 实习工匠
    /// </summary>
    class TraineeCraftsman
    {
    public:
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="pCommand"></param>
        TraineeCraftsman(Command* pCommand) :mPCommand(pCommand) {}
 
        /// <summary>
        /// 实习工匠交给工匠开始制作首饰
        /// </summary>
        void Notify()
        {
            mPCommand->Execute();
        }
 
        /// <summary>
        /// 析构函数
        /// </summary>
        ~TraineeCraftsman() //
        {
            if (mPCommand != nullptr)
            {
                delete mPCommand;
                mPCommand = nullptr;
            }
        }
    private:
 
        /// <summary>
        /// 实习工匠,有BOM清单列表
        /// </summary>
        Command* mPCommand;
 
 
 
    };
}
#endif
 
/*****************************************************************//**
 * \file   CraftsmanOld.h
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef CRAFTSMANOLD_H
#define CRAFTSMANOLD_H
 
 
 
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
 
using namespace std;
 
 
 
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
 
    /// <summary>
    ///
    /// </summary>
    class CraftsmanOld
    {
    public:
        /// <summary>
        ///
        /// </summary>
        /// <param name="pcommand"></param>
        void SetCommand(Command* pcommand)
        {
            mPCommand = pcommand;
        }
        /// <summary>
        ///
        /// </summary>
        void Notify()
        {
            mPCommand->Execute();
        }
    private:
        /// <summary>
        ///
        /// </summary>
        Command* mPCommand;
 
    };
}
#endif
 
/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief   Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit. 
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
#include "CommandEarring.h"
#include "CommandMacro.h"
#include "CommandNecklace.h"
#include "Craftsman.h"
#include "TraineeCraftsman.h"
#include "CraftsmanOld.h"
#include "TrainingCommand.h"



using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{

	private:

	public:
		/// <summary>
		/// 显示实例
		/// </summary>
		void displaySimple();
		/// <summary>
		/// 
		/// </summary>
		void displayTrainee();


	};


	//函数模板
	template <class T> //T代表可调用对象的类型
	void funcTmpTest(T callobj)//callobj是个可调用对象
	{
		callobj(100);
		return;
	}
}

#endif

/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief   Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit. 
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#include "GeovinDu.h"


using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{

	/// <summary>
	/// 实例 
	/// </summary>
	void GeovinDu::displaySimple()
	{

			DuCommonPattern::Gold* pgold = new DuCommonPattern::Gold();
			pgold->GoldNecklace();
			pgold->GoldEarring();

			cout << "****" << endl;
	
	
			DuCommonPattern::Gold gold1;
			DuCommonPattern::Command* pcmd1 = new DuCommonPattern::CommandNecklace(&gold1);
			pcmd1->Execute(); 

			DuCommonPattern::Command* pcmd2 = new DuCommonPattern::CommandEarring(&gold1);
			pcmd2->Execute(); 

			cout << "****" << endl;
			

			
			DuCommonPattern::Gold gold2;
			DuCommonPattern::CraftsmanOld* pcraftsman = new DuCommonPattern::CraftsmanOld();

			DuCommonPattern::Command* pcmd4 = new DuCommonPattern::CommandNecklace(&gold2);
			pcraftsman->SetCommand(pcmd4);
			pcraftsman->Notify();

			DuCommonPattern::Command* pcmd5 = new DuCommonPattern::CommandEarring(&gold2);
			pcraftsman->SetCommand(pcmd5);
			pcraftsman->Notify();


			cout << "****" << endl;
			
			DuCommonPattern::Gold gold3;
			
			DuCommonPattern::Command* pcmd3 = new DuCommonPattern::CommandNecklace(&gold3);		
			DuCommonPattern::Command* pcmd6 = new DuCommonPattern::CommandEarring(&gold3);

			DuCommonPattern::Craftsman* pcraftsman2 = new DuCommonPattern::Craftsman();
			
			pcraftsman2->AddCommand(pcmd3);
			pcraftsman2->AddCommand(pcmd6);

			
			pcraftsman2->Notify();





			//释放资源
			delete pgold;
			//释放资源
			delete pcmd1;
			delete pcmd2;

			//释放资源
			delete pcmd4;
			delete pcmd5;
			delete pcraftsman;



			//释放资源
			delete pcmd3;
			delete pcmd6;
			delete pcraftsman2;


	}
	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displayTrainee()
	{
		DuCommonPattern::TraineeCraftsman* ptrainee1 = new DuCommonPattern::TraineeCraftsman(new DuCommonPattern::CommandNecklace(new DuCommonPattern::Gold()));
		ptrainee1->Notify();
		DuCommonPattern::TraineeCraftsman* ptrainee2 = new DuCommonPattern::TraineeCraftsman(new DuCommonPattern::CommandEarring(new DuCommonPattern::Gold()));
		ptrainee2->Notify();

		//释放资源
		delete ptrainee1;
		delete ptrainee2;


		DuCommonPattern::TrainingCommand tc;
		tc(20); //调用的是()操作符,这就是个可调用对象。等价于tc.operator()(20);
		cout << tc(30, 50) << endl;

		
		DuCommonPattern::funcTmpTest(tc);

	}

}

调用:

/*****************************************************************//**
 * \file   ConsoleDuCommandPattern.cpp
 * \brief  Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command  C++ 14
 * 涂聚文 Geovin Du Visual Studio 2022 edit. 
 * 
 * \author geovindu
 * \date   26 May 2023
 *********************************************************************/
// ConsoleDuCommandPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//2023年5月26日 涂聚文 Geovin Du Visual Studio 2022 edit. 
#define _UNICODE
#include <iostream>
#include <list>
#include "GeovinDu.h"

#ifdef _DEBUG   //只在Debug(调试)模式下
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符
#define new DEBUG_NEW
#endif
#endif
using namespace std;
using namespace DuCommonPattern;

int main()
{

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口

    std::cout << "Hello World!!涂聚文 Geovin Du\n";
    GeovinDu geovin;
    geovin.displaySimple();
    cout << "2 simple" << endl;
    geovin.displayTrainee();

    system("pause");
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE

输出:

Hello World!!涂聚文 Geovin Du
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
2 simple
制作一条金项链
制作一对黄金耳环
TrainingCommand::operator(int tv)执行了,tv=20
TrainingCommand::operator(int tv1,int tv2)执行了,tv1=30,tv2=50
1
TrainingCommand::operator(int tv)执行了,tv=100
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值