设计模式之Component组合模式

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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖七少爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值