组合模式

今天做了组合模式的实验,花了差不多一个多小时的时间,成功运行了组合模式的代码,也知道了组合模式的原理,下面是组合模式的介绍以及实验要求及代码实现。

简介:

组合模式结构
组合模式用于以相同的方式处理单个对象和对象的组合(或复合)。可以视为树形结构,都继承一个基类,能表示单个部分或整个对象层次。可以分解为几个部分:

组件:在组合中所有对象的基础接口。其可以是接口或抽象类,包括管理子组合的通用方法。
叶子节点:实现基础组件的缺省行为,不包括对其他对象的引用。
组合节点:拥有叶子节点。实现基础组件的方法并定义子节点集合相关操作。
客户端:通过基础组件接口访问组合元素。

实验要求:

用透明组合模式实现教材中的“文件夹浏览”这个例子。

#include <iostream>
#include <list>
#include <memory>
#include <utility>
#include <cstddef>

using namespace std;

class File
{
public:
File(string name) { m_name = name; }
virtual ~File() {}
virtual void Add(std::unique_ptr<File>) {}//这里默认实现为空函数,leaf节点中不用实现为空了
virtual void Show(int depth) {} // 这里默认实现为空函数,leaf节点中不用实现为空了
protected:
string m_name;
};

//具体公司
class ConcreteFile : public File
{
public:
ConcreteFile(string name) : File(name) {}
virtual ~ConcreteFile()
{
for (auto& File : m_listFile)
{
File.reset(nullptr);
}
}
void Add(std::unique_ptr<File> pCom) { m_listFile.push_back(std::move(pCom)); } //位于树的中间,可以增加子树
void Show(int depth)
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
auto iter = m_listFile.begin();
for (; iter != m_listFile.end(); iter++) //显示下层结点
(*iter)->Show(depth + 2);
}
private:
list<std::unique_ptr<File>> m_listFile;
};

//具体的部门,财务部
class FinanceDepartment : public File
{
public:
FinanceDepartment(string name) :File(name) {}
virtual ~FinanceDepartment() {}
virtual void Show(int depth) //只需显示,无限添加函数,因为已是叶结点
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
}
};

//具体的部门,人力资源部
class HRDepartment :public File
{
public:
HRDepartment(string name) :File(name) {}
virtual ~HRDepartment() {}
virtual void Show(int depth) //只需显示,无限添加函数,因为已是叶结点
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
}
};

int main()
{
auto root = std::make_unique<ConcreteFile>("文件1");
auto leaf1 = std::make_unique < FinanceDepartment>("文件21");
auto leaf2 = std::make_unique < HRDepartment>("文件22");
root->Add(std::move(leaf1));
root->Add(std::move(leaf2));

//分公司
auto mid1 = std::make_unique < ConcreteFile>("文件31");
auto leaf3 = std::make_unique < FinanceDepartment>("文件41");
auto leaf4 = std::make_unique < HRDepartment>("文件42");
mid1->Add(std::move(leaf3));
mid1->Add(std::move(leaf4));
root->Add(std::move(mid1));
//分公司
auto mid2 = std::make_unique < ConcreteFile>("文件32");
auto leaf5 = std::make_unique < FinanceDepartment>("文件43");
auto leaf6 = std::make_unique < HRDepartment>("文件44");
mid2->Add(std::move(leaf5));
mid2->Add(std::move(leaf6));
root->Add(std::move(mid2));
root->Show(0);


return 0;
}

原文地址:https://www.cnblogs.com/092e/p/15543573.html