组合模式——C++实现
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;
}
运行结果如下:
打印出了目录结构。
比较简单,使用场景也比较受限,出场机会不多。