组合模式——C++实现

发布于:2025-02-11 ⋅ 阅读:(36) ⋅ 点赞:(0)

1. 模式简介

组合模式是一种结构型模式

组合模式又叫做部分整体模式,组合模式用于把一组相似的对象当做一个单一的对象。特别擅长处理树形的数据,对于非树形的数据不好用它。

对于树形的数据,一个典型的例子就是文件系统。在文件系统里大致上可以分为文件夹文件两种类型的数据文件夹中可以包含文件也可以包含其他文件夹。就像下面这张图一样,文件的组织就像一颗多叉树。

如果使用组合模式来实现类似tree命令的文件名打印,UML类图如下:

比较简单,不详细说了,直接看下面的代码吧,兄弟们

2. 代码示例

#include <iostream>
#include <string>
#include <vector>

using namespace std;


class FileSystem
{
public:
	FileSystem(string name) : m_name(name) {}
	virtual ~FileSystem() {}
	virtual void show(int level = 0)=0;
	virtual bool addFile(FileSystem* file)=0;
protected:
	string m_name;
};

class File : public FileSystem
{
public:
	File(string name) : FileSystem(name) {}
	void show(int level = 0)
	{
		for (int i = 0; i < level; i++)
			cout << "    ";
		cout << "- " << m_name << endl;
	}
	bool addFile(FileSystem* file) { return false; }
};

class Directory : public FileSystem
{
public:
	Directory(string name) : FileSystem(name) {}
	void show(int level = 0)
	{
		for (int i = 0; i < level; i++)
			cout << "    ";
		cout << "+ " << m_name << endl;
		for (int i = 0; i < m_files.size(); i++)
			m_files[i]->show(level + 1);
	}
	bool addFile(FileSystem* file)
	{
		if (file == NULL)
			return false;
		m_files.push_back(file);
		return true;
	}
private:
	vector<FileSystem*> m_files;
};

int main()
{
	Directory* root = new Directory("root");
	Directory* dir1 = new Directory("dir1");
	Directory* dir2 = new Directory("dir2");
	File* file1 = new File("file1");
	File* file2 = new File("file2");
	File* file3 = new File("file3");
	root->addFile(dir1);
	root->addFile(dir2);
	dir1->addFile(file1);
	dir1->addFile(file2);
	dir2->addFile(file3);
	root->show();

	delete root;
	delete dir1;
	delete dir2;
	delete file1;
	delete file2;
	delete file3;

	return 0;
}

运行结果如下:

打印出了目录结构。

比较简单,使用场景也比较受限,出场机会不多。


网站公告

今日签到

点亮在社区的每一天
去签到