首页 > 其他分享 >cpp: Composite Pattern

cpp: Composite Pattern

时间:2023-05-28 14:11:46浏览次数:43  
标签:DuJadeCompositePattern Composite Pattern Add DuCompositePattern cpp new include 

 

/*****************************************************************//**
 * \file   GoldDir.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDDIR_H 
#define GOLDDIR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "GoldFile.h"


using namespace std;



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

	/// <summary>
	/// 目录相关类
	/// </summary>
	class GoldDir
	{
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		GoldDir(string name) :mSname(name) {}

	public:
		/// <summary>
		/// 目录中可以增加其他文件
		/// </summary>
		/// <param name="pfile"></param>
		void AddFile(GoldFile* pfile)
		{
			mChildFile.push_back(pfile);
		}

		/// <summary>
		/// 目录中可以增加其他目录
		/// </summary>
		/// <param name="pdir"></param>
		void AddDir(GoldDir* pdir)
		{
			mChildDir.push_back(pdir);
		}

		/// <summary>
		/// 显示目录名,同时也要负责其下面的文件和目录名的显示工作
		/// </summary>
		/// <param name="lvlstr"></param>
		void ShowName(string lvlstr) //lvlstr:为了显示层次关系的缩进字符串内容
		{
			//(1)输出本目录名
			cout << lvlstr << "+" << mSname << endl;//显示"+"代表是一个目录,其中会包含其他内容
			//(2)输出所包含的文件名
			lvlstr += "    "; //本目录中的文件和目录的显示,要缩进一些来显示
			for (auto iter = mChildFile.begin(); iter != mChildFile.end(); ++iter)
			{
				(*iter)->ShowName(lvlstr); //显示文件名
			}
			//(3)输出所包含的目录名
			for (auto iter = mChildDir.begin(); iter != mChildDir.end(); ++iter)
			{
				(*iter)->ShowName(lvlstr); //显示目录名,这里涉及到了递归调用
			}
		}

	private:
		/// <summary>
		/// 目录名
		/// </summary>
		string       mSname;       
		/// <summary>
		/// 目录中包含的文件列表,记得在源文件上面增加代码 #include <list>
		/// </summary>
		list<GoldFile*>  mChildFile;   
		/// <summary>
		/// 目录中包含的子目录列表
		/// </summary>
		list<GoldDir*>   mChildDir;   


	};

}

#endif

/*****************************************************************//**
 * \file   GoldFile.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDFILE_H 
#define GOLDFILE_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>


using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCompositePattern
{
	/// <summary>
	/// 文件相关类
	/// </summary>
	class GoldFile
	{

	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		GoldFile(string name) :mSname(name) {}

		/// <summary>
		/// 显示文件名
		/// </summary>
		/// <param name="lvlstr"></param>
		void ShowName(string lvlstr)
		{
			cout << lvlstr << "-" << mSname << endl; //显示"-"代表是一个文件,属末端节点(不会再有子节点)
		}
	private:
		string mSname;  //文件名


	};

}

#endif

/*****************************************************************//**
 * \file   PearFile.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef PEARFILE_H 
#define PEARFILE_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "PearFileSystem.h"

using namespace std;



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

	/// <summary>
	/// 文件相关类
	/// </summary>
	class PearFile:public PearFileSystem
	{
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		PearFile(string name) :mSname(name) {}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="level"></param>
		void ShowName(int level)
		{
			for (int i = 0; i < level; ++i) { cout << "    "; } //显示若干个空格用与对齐
			cout << "-" << mSname << endl;
		}
		/// <summary>
		///添加
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Add(PearFileSystem* pfilesys)
		{
			//文件中其实是不可以增加其他文件或者目录的,所以这里直接返回-1,无奈的是父类中定义了该接口,所以子类中也必须实现该接口
			return -1;
		}
		/// <summary>
		/// 移除
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Remove(PearFileSystem* pfilesys)
		{
			//文件中不包含其他文件或者目录,所以这里直接返回-1
			return -1;
		}
	private:
		/// <summary>
		/// 文件名
		/// </summary>
		string mSname;  


	};
}
#endif

/*****************************************************************//**
 * \file   PearDir.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef PEARDIR_H 
#define PEARDIR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "PearFileSystem.h"

using namespace std;



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

	/// <summary>
	/// 目录相关类
	/// </summary>
	class PearDir:public PearFileSystem
	{
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		PearDir(string name) :mSname(name) {}
		/// <summary>
		/// 显示名字
		/// </summary>
		/// <param name="level"></param>
		void ShowName(int level)
		{
			//(1)显示若干个空格用与对齐
			for (int i = 0; i < level; ++i) { cout << "    "; }
			//(2)输出本目录名
			cout << "+" << mSname << endl;
			//(3)显示的层级向下走一级
			level++;
			//(4)输出所包含的子内容(可能是文件,也可能是子目录)	
			//遍历目录中的文件和子目录
			for (auto iter = mChild.begin(); iter != mChild.end(); ++iter)
			{
				(*iter)->ShowName(level);
			}//end for
		}
		/// <summary>
		/// 增加
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Add(PearFileSystem* pfilesys)
		{
			mChild.push_back(pfilesys);
			return 0;
		}
		/// <summary>
		/// 移除
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Remove(PearFileSystem* pfilesys)
		{
			mChild.remove(pfilesys);
			return 0;
		}
	private:
		/// <summary>
		/// 文件名
		/// </summary>
		string mSname;      
		/// <summary>
		/// 目录中包含的文件或其他目录列表
		/// </summary>
		list<PearFileSystem*> mChild;  //


	};

}

#endif

/*****************************************************************//**
 * \file   PearFileSystem.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef PEARFILESYSTEM_H 
#define PEARFILESYSTEM_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>


using namespace std;



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

	/// <summary>
	/// 抽象父类FileSystem(抽象接口)
	/// </summary>
	class PearFileSystem
	{
	public:
		/// <summary>
		/// 
		/// </summary>
		/// <param name="level"></param>
		virtual void ShowName(int level) = 0; //显示名字,参数level用于表示显示的层级,用于显示对齐
		/// <summary>
		/// 向当前目录中增加文件或子目录
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Add(PearFileSystem* pfilesys) = 0; 
		/// <summary>
		/// 从当前目录中移除文件或子目录
		/// </summary>
		/// <param name="pfilesys"></param>
		/// <returns></returns>
		virtual int Remove(PearFileSystem* pfilesys) = 0;

		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~PearFileSystem() {} 

	};

}

#endif

/*****************************************************************//**
 * \file   JadeFile.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef JADEFILE_H 
#define JADEFILE_H  



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "JadeFileSystem.h"

using namespace std;



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

	/// <summary>
	/// 文件相关类
	/// </summary>
	class JadeFile :public JadeFileSystem
	{

	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		JadeFile(string name) :mSname(name) {}

		/// <summary>
		/// 显示名字
		/// </summary>
		/// <param name="level"></param>
		void ShowName(int level)
		{
			for (int i = 0; i < level; ++i) { cout << "    "; } //显示若干个空格用与对齐
			cout << "-" << mSname << endl;
		}

	public:
		virtual int countNumOfFiles()
		{
			return 1; //文件节点,做数量统计时按1计算
		}

	private:
		/// <summary>
		/// 文件名
		/// </summary>
		string mSname;

	};

}

#endif

/*****************************************************************//**
 * \file   JadeDir.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef JADEDIR_H 
#define JADEDIR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "JadeFileSystem.h"

using namespace std;



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

	/// <summary>
	/// 
	/// </summary>
	class JadeDir:public JadeFileSystem
	{
		//该类内容基本没变,把Add和Remove成员函数前面的virtual修饰符去掉即可。
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name"></param>
		JadeDir(string name) :mSname(name) {}
		/// <summary>
		/// 显示名字
		/// </summary>
		/// <param name="level"></param>
		void ShowName(int level)
		{
			//(1)显示若干个空格用与对齐
			for (int i = 0; i < level; ++i) { cout << "    "; }
			//(2)输出本目录名
			cout << "+" << mSname << endl;
			//(3)显示的层级向下走一级
			level++;
			//(4)输出所包含的子内容(可能是文件,也可能是子目录)	
			//遍历目录中的文件和子目录
			for (auto iter = mChild.begin(); iter != mChild.end(); ++iter)
			{
				(*iter)->ShowName(level);
			}//end for
		}
		/*virtual*/
		int Add(JadeFileSystem* pfilesys)
		{
			mChild.push_back(pfilesys);
			return 0;
		}
		/*virtual*/ 
		
		int Remove(JadeFileSystem* pfilesys)
		{
			mChild.remove(pfilesys);
			return 0;
		}

	public:
		virtual JadeDir* ifCompositeObj() { return this; }

	public:
		virtual int countNumOfFiles()
		{
			int iNumOfFiles = 0;
			for (auto iter = mChild.begin(); iter != mChild.end(); ++iter)
			{
				iNumOfFiles += (*iter)->countNumOfFiles();//递归调用
			}
			return iNumOfFiles;
		}


	private:
		/// <summary>
		/// 文件名
		/// </summary>
		string mSname;      
		/// <summary>
		/// 
		/// </summary>
		list<JadeFileSystem*> mChild; 


	};
}
#endif

/*****************************************************************//**
 * \file   JadeFileSystem.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef JADEFILESYSTEM_H 
#define JADEFILESYSTEM_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>


using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuJadeCompositePattern
{
	class JadeDir;
	/// <summary>
	/// 
	/// </summary>
	class JadeFileSystem
	{
	public:

		/// <summary>
		/// 显示名字,参数level用于表示显示的层级,用于显示对齐		
		/// </summary>
		/// <param name="level"></param>
		virtual void ShowName(int level) = 0; 
		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~JadeFileSystem() {}

	public:
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		virtual JadeDir* ifCompositeObj() { return nullptr; }

	public:
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		virtual int countNumOfFiles() = 0;  //统计目录下包含的文件个数


	};
}
#endif

  

/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 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 "GoldFile.h"
#include "GoldDir.h"
#include "PearFileSystem.h"
#include "PearDir.h"
#include "PearFile.h"

#include "JadeDir.h"
#include "JadeFile.h"
#include "JadeFileSystem.h"


using namespace std;
using namespace DuPearCompositePattern;
using namespace DuJadeCompositePattern;

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

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

	private:

	public:

		/// <summary>
		///示例
		/// </summary>
		void displaySimple();
		/// <summary>
		/// 
		/// </summary>
		void displayPearSimple();

		/// <summary>
		/// 
		/// </summary>
		void displayJadeSimple();
	};
}
#endif

/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#include "GeovinDu.h"

using namespace std;
using namespace DuPearCompositePattern;
using namespace DuJadeCompositePattern;


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

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


		//(1)创建各种目录,文件对象
		DuCompositePattern::GoldDir* pdir1 = new DuCompositePattern::GoldDir("root");
		//-------
		DuCompositePattern::GoldFile* pfile1 = new DuCompositePattern::GoldFile("common.mk");
		DuCompositePattern::GoldFile* pfile2 = new DuCompositePattern::GoldFile("config.mk");
		DuCompositePattern::GoldFile* pfile3 = new DuCompositePattern::GoldFile("makefile");
		//-------
		DuCompositePattern::GoldDir* pdir2 = new DuCompositePattern::GoldDir("app");
		DuCompositePattern::GoldFile* pfile4 = new DuCompositePattern::GoldFile("nginx.c");
		DuCompositePattern::GoldFile* pfile5 = new DuCompositePattern::GoldFile("ngx_conf.c");
		//-------
		DuCompositePattern::GoldDir* pdir3 = new DuCompositePattern::GoldDir("signal");
		DuCompositePattern::GoldFile* pfile6 = new DuCompositePattern::GoldFile("ngx_signal.c");
		//-------
		DuCompositePattern::GoldDir* pdir4 = new DuCompositePattern::GoldDir("_include");
		DuCompositePattern::GoldFile* pfile7 = new DuCompositePattern::GoldFile("ngx_func.h");
		DuCompositePattern::GoldFile* pfile8 = new DuCompositePattern::GoldFile("ngx_signal.h");

		//(2)构造树形目录结构
		pdir1->AddFile(pfile1);
		pdir1->AddFile(pfile2);
		pdir1->AddFile(pfile3);
		//-------
		pdir1->AddDir(pdir2);
		pdir2->AddFile(pfile4);
		pdir2->AddFile(pfile5);
		//-------
		pdir1->AddDir(pdir3);
		pdir3->AddFile(pfile6);
		//-------
		pdir1->AddDir(pdir4);
		pdir4->AddFile(pfile7);
		pdir4->AddFile(pfile8);

		//(3)输出整个目录结构,只要调用根目录的ShowName方法即可,每个子目录都有自己的ShowName方法负责自己旗下的文件和目录的显示
		pdir1->ShowName("");//缩进字符刚开始可以为空

		//(4)释放资源
		delete pfile8;
		delete pfile7;
		delete pdir4;
		//-------
		delete pfile6;
		delete pdir3;
		//-------
		delete pfile5;
		delete pfile4;
		delete pdir2;
		//-------
		delete pfile3;
		delete pfile2;
		delete pfile1;
		delete pdir1;
		


	}

	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displayPearSimple()
	{

		//(1)创建各种目录,文件对象
		DuPearCompositePattern::PearFileSystem* pdir1 = new DuPearCompositePattern::PearDir("root");
		//-------
		DuPearCompositePattern::PearFileSystem* pfile1 = new DuPearCompositePattern::PearFile("common.mk");
		DuPearCompositePattern::PearFileSystem* pfile2 = new DuPearCompositePattern::PearFile("config.mk");
		DuPearCompositePattern::PearFileSystem* pfile3 = new DuPearCompositePattern::PearFile("makefile");
		//-------
		DuPearCompositePattern::PearFileSystem* pdir2 = new DuPearCompositePattern::PearDir("app");
		DuPearCompositePattern::PearFileSystem* pfile4 = new DuPearCompositePattern::PearFile("nginx.c");
		DuPearCompositePattern::PearFileSystem* pfile5 = new DuPearCompositePattern::PearFile("ngx_conf.c");
		//-------
		DuPearCompositePattern::PearFileSystem* pdir3 = new DuPearCompositePattern::PearDir("signal");
		DuPearCompositePattern::PearFileSystem* pfile6 = new DuPearCompositePattern::PearFile("ngx_signal.c");
		//-------
		DuPearCompositePattern::PearFileSystem* pdir4 = new DuPearCompositePattern::PearDir("_include");
		DuPearCompositePattern::PearFileSystem* pfile7 = new DuPearCompositePattern::PearFile("ngx_func.h");
		DuPearCompositePattern::PearFileSystem* pfile8 = new DuPearCompositePattern::PearFile("ngx_signal.h");

		//(2)构造树形目录结构
		pdir1->Add(pfile1);
		pdir1->Add(pfile2);
		pdir1->Add(pfile3);
		//-------
		pdir1->Add(pdir2);
		pdir2->Add(pfile4);
		pdir2->Add(pfile5);
		//-------
		pdir1->Add(pdir3);
		pdir3->Add(pfile6);
		//-------
		pdir1->Add(pdir4);
		pdir4->Add(pfile7);
		pdir4->Add(pfile8);

		//(3)输出整个目录结构,只要调用根目录的ShowName方法即可,每个子目录都有自己的ShowName方法负责自己旗下的文件和目录的显示	
		pdir1->ShowName(0);

		//(4)释放资源
		delete pfile8;
		delete pfile7;
		delete pdir4;
		//-------
		delete pfile6;
		delete pdir3;
		//-------
		delete pfile5;
		delete pfile4;
		delete pdir2;
		//-------
		delete pfile3;
		delete pfile2;
		delete pfile1;
		delete pdir1;

	}
	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displayJadeSimple()
	{
		//(1)创建各种目录,文件对象
		DuJadeCompositePattern::JadeDir* pdir1 = new DuJadeCompositePattern::JadeDir("root");
		//-------
		DuJadeCompositePattern::JadeFileSystem* pfile1 = new DuJadeCompositePattern::JadeFile("common.mk");
		DuJadeCompositePattern::JadeFileSystem* pfile2 = new DuJadeCompositePattern::JadeFile("config.mk");
		DuJadeCompositePattern::JadeFileSystem* pfile3 = new DuJadeCompositePattern::JadeFile("makefile");
		//-------
		DuJadeCompositePattern::JadeDir* pdir2 = new DuJadeCompositePattern::JadeDir("app");
		if (pdir2->ifCompositeObj() != nullptr)
		{
			//是个组合对象,可以向其中增加单个对象和其它组合对象
		}
		if (dynamic_cast<DuJadeCompositePattern::JadeDir*>(pdir2) != nullptr)
		{
			//是个组合对象,可以向其中增加单个对象和其它组合对象
		}

		DuJadeCompositePattern::JadeFileSystem* pfile4 = new DuJadeCompositePattern::JadeFile("nginx.c");
		DuJadeCompositePattern::JadeFileSystem* pfile5 = new DuJadeCompositePattern::JadeFile("ngx_conf.c");
		//-------
		DuJadeCompositePattern::JadeDir* pdir3 = new DuJadeCompositePattern::JadeDir("signal");
		DuJadeCompositePattern::JadeFileSystem* pfile6 = new DuJadeCompositePattern::JadeFile("ngx_signal.c");
		//-------
		DuJadeCompositePattern::JadeDir* pdir4 = new DuJadeCompositePattern::JadeDir("_include");
		DuJadeCompositePattern::JadeFileSystem* pfile7 = new DuJadeCompositePattern::JadeFile("ngx_func.h");
		DuJadeCompositePattern::JadeFileSystem* pfile8 = new DuJadeCompositePattern::JadeFile("ngx_signal.h");

		//(2)构造树形目录结构
		//这部分内容基本没变,
		pdir1->Add(pfile1);
		pdir1->Add(pfile2);
		pdir1->Add(pfile3);
		//-------
		pdir1->Add(pdir2);
		pdir2->Add(pfile4);
		pdir2->Add(pfile5);
		//-------
		pdir1->Add(pdir3);
		pdir3->Add(pfile6);
		//-------
		pdir1->Add(pdir4);
		pdir4->Add(pfile7);
		pdir4->Add(pfile8);

		//(3)输出整个目录结构,只要调用根目录的ShowName方法即可,每个子目录都有自己的ShowName方法负责自己旗下的文件和目录的显示
		pdir1->ShowName(0);

		cout << "文件的数量为:" << pdir1->countNumOfFiles() << endl;

		//(4)释放资源
		//这部分内容基本没变,
		delete pfile8;
		delete pfile7;
		delete pdir4;
		//-------
		delete pfile6;
		delete pdir3;
		//-------
		delete pfile5;
		delete pfile4;
		delete pdir2;
		//-------
		delete pfile3;
		delete pfile2;
		delete pfile1;
		delete pdir1;


	}

}

  

调用:

/*****************************************************************//**
 * \file   ConsoleDuCompositePattern.cpp
 * \brief  组合模式CompositePattern 亦称: 对象树、Object Tree、Composite c++14
 * 2023年5月28日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/


// ConsoleDuCompositePattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
#define _UNICODE

#include <iostream>
#include <vector>
#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 DuCompositePattern;

int main()
{
   
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口
    std::cout << "Hello World!涂聚文 Geovin Du\n";

    GeovinDu geovin;
    geovin.displaySimple();
    cout << "*********" << endl;
    geovin.displayPearSimple();
    cout << "*********" << endl;
    geovin.displayJadeSimple();

    system("pause");
    return 0;

}

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

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

  

输出:

Hello World!涂聚文 Geovin Du
+root
    -common.mk
    -config.mk
    -makefile
    +app
        -nginx.c
        -ngx_conf.c
    +signal
        -ngx_signal.c
    +_include
        -ngx_func.h
        -ngx_signal.h
*********
+root
    -common.mk
    -config.mk
    -makefile
    +app
        -nginx.c
        -ngx_conf.c
    +signal
        -ngx_signal.c
    +_include
        -ngx_func.h
        -ngx_signal.h
*********
+root
    -common.mk
    -config.mk
    -makefile
    +app
        -nginx.c
        -ngx_conf.c
    +signal
        -ngx_signal.c
    +_include
        -ngx_func.h
        -ngx_signal.h
文件的数量为:8
请按任意键继续. . .

  

 

标签:DuJadeCompositePattern,Composite,Pattern,Add,DuCompositePattern,cpp,new,include,
From: https://www.cnblogs.com/geovindu/p/17438199.html

相关文章

  • 策略模式-StrategyPattern-使用案例
    TheStrategypatternisabehavioraldesignpatternthatallowsyoutodefineafamilyofalgorithms,encapsulateeachoneasaseparateclass,andmaketheminterchangeable.Itenablesclientstochoosefromdifferentalgorithmsatruntimewithouttightl......
  • cpp: Iterator Pattern
     /*****************************************************************//***\fileGoldIterator.h*\brief迭代器模式IteratorPattern*2023年5月22日涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateMay2023*******************......
  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】
     〇、简介1、什么是简单工厂模式?一句话解释:  客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。简单工厂模式(SimpleFactoryPattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需......
  • 《设计模式之禅》Multition_Pattern--多例模式
    多例模式嘿,咱们书接上回。单例模式就是每次只能有一个实例,那么多例模式就是可以有多个实例对象。那在中国历史上有没有这种事情发生过呢,嘿,你别说,还真有,就出现在明朝,那三国期间的算不算,不算,各自称帝,各有各的地盘,国号不同。大家还记得那首诗《石灰吟》吗?作者是谁?于谦,他是被谁杀死的?明......
  • CPPCheck 安装使用
    直接通过命令行安装:sudoapt-getinstallcppcheck通过下载源码包安装,比如2.10版本:1.登录http://cppcheck.net/下载2.10版本soucecode并解压2.cdcppcheck-2.10&&mkdirbuild&&cdbuild3.cmake..可能报错:NOCMAKE_CXX_COMPILERcouldbefoundSo......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • 【CPP0049】以Point类及平面基类Plane类为基础设计圆类Circle并实现相关文件操作
    基于Point类及平面基类Plane类,设计圆类Circle,并为Point类和Circle重载实现<<和>>运算符,main(void)函数实现Point对象和Circle对象的文件读写操作。@Point类结构说明: Point类的数据成员包括:①私有数据成员:X坐标x(double型),Y坐标y(double型)。Point类成员函数包括:①有参构造......
  • 享元模式(Flyweight Pattern)
    享元模式(FlyweightPattern)一、定义享元模式(FlyweightPattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。运用共享技术有效地支持大量细粒度的对象。二、优缺点优点:大......
  • pta_【CPP0038】单向链表模板类
    #include<iostream>usingnamespacestd;template<typenameT>classNode{public:Node(Tdata):data(data),next(nullptr){cout<<"NodeConstructorrun"<<endl;}Node(constNode<T>&other)......
  • 外观模式(Facade Pattern)
    外观模式(FacadePattern)一、定义 外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对......