设计模式之: 组合模式(composite)

组合模式


组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构,表征了一种相似对象的树形组织形式;其特点是,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦;


c++实现:

/*************************************************************************
	> File Name: composite.cpp
	> Author: XXDK
	> Email: v.manstein@qq.com 
	> Created Time: Tue 09 Oct 2018 03:35:40 PM CST
 ************************************************************************/

#include<iostream>
#include<vector>

using namespace std;

class Component
{
public:
	Component(std::string name) : name_(name) {}
	virtual ~Component() {}
	virtual void Add(Component* cp) = 0;
	virtual void Remove(Component* cp) = 0;
	virtual Component* GetChild(int index) = 0;
	virtual void Operation(int indent) = 0;

private:
	Component();

protected:
	std::string name_;
};

class File : public Component
{
public:
	File(std::string name) : Component(name) {}

	virtual ~File() {}

	void Add(Component* cp) {
		std::cout << "invalid add operation." << std::endl;
	}

	void Remove(Component* cp) {
		std::cout << "invalid remove operation." << std::endl;
	}

	Component* GetChild(int index) {
		std::cout << "Can't get child from file'" << std::endl;
		return NULL;
	}

	void Operation(int indent) {
		std::string str(indent, '-');
		std::cout << str << " " << name_ << std::endl;
	}

private:
	File();
};

class Folder : public Component 
{
public:
	Folder(std::string name) : Component(name) {}

	virtual ~Folder() {
		while (!elements_.empty()) {
			std::vector<Component*>::iterator it = elements_.begin();
			if (*it) {
				delete *it, *it = NULL;
			}
			elements_.erase(it);
		}
	}

	void Add(Component* cp) {
		elements_.push_back(cp);
	}
	
	void Remove(Component* cp) {
		std::vector<Component*>::iterator it = elements_.begin();
		while (it != elements_.end()) {
			if (*it == cp) {
				delete *it, *it = NULL;
				elements_.erase(it);
				break;
			}
			++it;
		}
	}

	Component* GetChild(int index) {
		if (index >= elements_.size()) {
			return NULL;
		}

		return elements_[index];
	}

	void Operation(int indent) {
		std::string str(indent, '-');
		std::cout << str << "+ " << name_ << std::endl;

		std::vector<Component*>::iterator it = elements_.begin();
		while (it != elements_.end()) {
			(*it)->Operation(indent + 4);
			++it;
		}
	}

private:
	Folder();
	std::vector<Component*> elements_;
};

int main()
{
	Component* pRoot = new Folder("/home/xxdk/");
	pRoot->Add(new File("README"));
	pRoot->Add(new File("Log"));

	Component* pVideo = new Folder("video/");
	pVideo->Add(new File("The Expendables"));
	pVideo->Add(new File("Tears of the Sun"));
	pRoot->Add(pVideo);

	Component* pAudio = new Folder("audio/");
	pAudio->Add(new File("Gee"));
	pAudio->Add(new File("Genie"));
	pRoot->Add(pAudio);

	Component* pPicture = new Folder("picture/");
	pPicture->Add(new File("Flower"));
	pPicture->Add(new File("Grass"));
	pRoot->Add(pPicture);

	pRoot->Operation(0);

	delete pRoot, pRoot = NULL;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值