码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之组合模式

时间:2014-07-31 13:18:26      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:设计模式   组合模式   

定义:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组成:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。


以一个文件结构为例。

每一个文件或者目录都可以看作一个节点,而对于目录节点又有添加删除子节点的操作。

bubuko.com,布布扣

首先定义一个抽象基类节点。

class Node
{
public:
	virtual void Add(Node* tmp)=0;
	virtual void Remove()=0;
	virtual void Display(string str)=0;
};

对于文件节点,没有添加删除操作。

class File : public Node
{
private:
	string Name;
	void Add(Node* c){}
	void Remove(){}
public:
	File(string name) { Name = name; }
	void Display(string str)
	{
		string strtmp = str + Name;
		cout<<strtmp<<endl;
	}
};

对于文件夹,可以用一个链表来存储其子文件夹和文件

class DirFolder :public  Node
{
private:
	list<Node*> subfolder;
	string Name;
public:
	int length = 0;
	DirFolder(string name) { Name = name; }
	void Add(Node* tmp)
	{
		length = length + 1;
		subfolder.push_back(tmp);
	}
	void Remove()
	{
		if (length == 0) return;
		length = length - 1;
		subfolder.pop_back();
	}
	void Display(string str)
	{
		cout<<str<<Name<<endl;
		str = str + "---";
		for (Node* component:subfolder)
		{
			component->Display(str);
		}
	}
};

测试:

int main()
{
	DirFolder root("root");
	//添加文件
	File* file1=new File("file1");
	root.Add(file1);
	//添加子文件夹
	File* file2=new File("file2");
	root.Add(file2);


	//添加文件
	DirFolder* subdir=new DirFolder("subdir");
	File* file3=new File("file3");
	subdir->Add(file3);
	File* file4=new File("file4");
	subdir->Add(file4);


	//删除子文件夹
	root.Add(subdir);
	root.Display("");
	root.Remove();
	root.Display("");
	return 0;
}




适用:
表示对象的部分-整体层次结构

整体与部分需要被一致对待时。



设计模式之组合模式,布布扣,bubuko.com

设计模式之组合模式

标签:设计模式   组合模式   

原文地址:http://blog.csdn.net/zsp_skyer/article/details/38315047

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!