1. 透明组合模式
透明组合模式中,抽象构件类包含叶子构件行为和容器构件行为的并集,抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()以及getChild()等方法,这样做的好处是确保所有的构件类都有相同的接口。透明组合模式也是组合模式的标准形式,管理成员对象的方法在叶子构件可见所以是透明的,对于这些方法需要通过抛出异常、提示错误等方式进行处理。
1.1. Component(抽象构建)
class AbstractFile
{
public:
virtual ~AbstractFile() = default;
virtual void add(AbstractFile *file) = 0;
virtual void remove(AbstractFile *file) = 0;
virtual void killVirus() = 0;
protected:
AbstractFile() = default;
};
1.2. Leaf(叶子构建)
class ImageFile : public AbstractFile
{
public:
explicit ImageFile(const std::string &name)
{
std::cout << "ImageFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~ImageFile()
{
std::cout << "~ImageFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对图像文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};
class TextFile : public AbstractFile
{
public:
explicit TextFile(const std::string &name)
{
std::cout << "TextFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~TextFile()
{
std::cout << "~TextFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对文本文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};
class VideoFile : public AbstractFile
{
public:
explicit VideoFile(const std::string &name)
{
std::cout << "VideoFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~VideoFile()
{
std::cout << "~VideoFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对视频文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};
1.3. Composite(容器构建)
class Folder : public AbstractFile
{
public:
explicit Folder(const std::string &name)
{
std::cout << "VideoFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~Folder() override
{
std::cout << "~Folder 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
m_fileList.push_back(file);
}
void remove(AbstractFile *file) override
{
m_fileList.remove(file);
}
void killVirus() override {
std::cout << "---对文件夹:" << m_sName << "进行杀毒---" << std::endl;
//调用成员构建的killVirus()方法
for (AbstractFile *obj : m_fileList)
{
obj->killVirus();
}
}
private:
std::string m_sName;
std::list<AbstractFile*> m_fileList;
};
1.4. 主函数
#include <list>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <functional>>
//#include <memory>
using namespace std;
void main()
{
std::cout << "----透明组合模式----" << std::endl;
//针对抽象构件编程
AbstractFile *file1, *file2, *file3, *file4, *file5, *folder1, *folder2, *folder3, *folder0;
folder0 = new Folder("根目录文件夹");
folder1 = new Folder("图像文件夹");
folder2 = new Folder("文本文件夹");
folder3 = new Folder("视频文件夹");
file1 = new ImageFile("图片01.jpg");
file2 = new ImageFile("图片02.gif");
file3 = new TextFile("文本01.txt");
file4 = new TextFile("文本02.doc");
file5 = new VideoFile("视频01.rmvb");
folder1->add(file1);
folder1->add(file2);
folder2->add(file3);
folder2->add(file4);
folder3->add(file5);
folder0->add(folder1);
folder0->add(folder2);
folder0->add(folder3);
//从 根目录文件夹 节点开始进行模拟杀毒操作
folder0->killVirus();
std::cout << "----叶子构件调用管理成员对象的方法----" << std::endl;
file1->add(file2);
file3->remove(file4);
delete file1;
delete file2;
delete file3;
delete file4;
delete file5;
delete folder0;
delete folder1;
delete folder2;
delete folder3;
system("pause");
}
2. 安全组合模式
安全组合模式中,抽象构件类包含叶子构件行为和容器构件行为的交集,在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法。这种做法是安全的,因为根本不向叶子对象提供这些管理成员对象的方法,对于叶子对象,客户端不可能调用到这些方法。
2.1. Component(抽象构建)
class AbstractFile
{
public:
virtual ~AbstractFile() = default;virtual void add(AbstractFile *file) = 0;
virtual void remove(AbstractFile *file) = 0;
virtual void killVirus() = 0;
protected:
AbstractFile() = default;
};
2.2. Leaf(叶子构建)
class ImageFile : public AbstractFile
{
public:
explicit ImageFile(const std::string &name)
{
std::cout << "ImageFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~ImageFile()
{
std::cout << "~ImageFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对图像文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};class TextFile : public AbstractFile
{
public:
explicit TextFile(const std::string &name)
{
std::cout << "TextFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~TextFile()
{
std::cout << "~TextFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对文本文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};class VideoFile : public AbstractFile
{
public:
explicit VideoFile(const std::string &name)
{
std::cout << "VideoFile 构造函数" << name << std::endl;
this->m_sName = name;
}
~VideoFile()
{
std::cout << "~VideoFile 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void remove(AbstractFile *file) override
{
std::cout << "不支持该方法!" << std::endl;
}
void killVirus() override
{
//模拟杀毒
std::cout << "---对视频文件:" << m_sName << "进行杀毒---" << std::endl;
}
private:
std::string m_sName;
};
2.3. Composite(容器构建)
class Folder : public AbstractFile
{
public:
explicit Folder(const std::string &name)
{
std::cout << "VideoFile 构造函数" << name << std::endl;
this->m_sName = name;
}~Folder() override
{
std::cout << "~Folder 析构函数" << m_sName << std::endl;
}
void add(AbstractFile *file)override
{
m_fileList.push_back(file);
}void remove(AbstractFile *file)
override
{
m_fileList.remove(file);
}void killVirus() override {
std::cout << "---对文件夹:" << m_sName << "进行杀毒---" << std::endl;
//调用成员构建的killVirus()方法
for (AbstractFile *obj : m_fileList)
{
obj->killVirus();
}
}
private:
std::string m_sName;
std::list<AbstractFile*> m_fileList;
};
2.4. 主函数
void main()
{
std::cout << "----安全组合模式----" << std::endl;
//针对抽象构件编程
AbstractFile *file1, *file2, *file3, *file4, *file5,*folder0, *folder1, *folder2, *folder3;
Folder *folder0, *folder1, *folder2, *folder3;folder0 = new Folder("根目录文件夹");
folder1 = new Folder("图像文件夹");
folder2 = new Folder("文本文件夹");
folder3 = new Folder("视频文件夹");file1 = new ImageFile("图片01.jpg");
file2 = new ImageFile("图片02.gif");
file3 = new TextFile("文本01.txt");
file4 = new TextFile("文本02.doc");
file5 = new VideoFile("视频01.rmvb");folder1->add(file1);
folder1->add(file2);
folder2->add(file3);
folder2->add(file4);
folder3->add(file5);folder0->add(folder1);
folder0->add(folder2);
folder0->add(folder3);//从 根目录文件夹 节点开始进行模拟杀毒操作
folder0->killVirus();delete file1;
delete file2;
delete file3;
delete file4;
delete file5;
delete folder0;
delete folder1;
delete folder2;
delete folder3;system("pause");
}