组合模式
1、组合模式简介
组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户可以一致的方式处理单个对象或对象的组合。组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,
可以对其进行统一处理。
2、组合模式应用场景
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。
基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。
用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合二写一些选择判断语句了。
组合模式让客户可以一致地使用组合结构和单个对象。
3、组合模式举例
以window下的文件系统举例,文件夹下面可以有文件,也可以有文件夹,此时便是典型的组合模式应用场景。引入组合模式后对于用户来说无需关注到底是文件还是文件夹,都可以按照文件夹来进行增删的操作,不过叶子节点(文件)不去实现而已。
现有如下文件系统

class Component
{
protected:
std::string m_strName;
public:
Component(std::string str)
{
m_strName = str;
}
virtual void add(Component * p) = 0;
virtual void remove(Component * p) = 0;
virtual void Show() = 0;
};
class File : public Component
{
public:
File(std::string str) : Component(str) {}
void add(Component * p)
{
std::cout << "file cannot add file" << std::endl;
}
void remove(Component * p)
{
std::cout << "file cannot remove file" << std::endl;
}
void Show()
{
std::cout << m_strName << std::endl;
}
};
class Folder : public Component
{
public:
Folder(std::string str) : Component(str) {};
~Folder()
{
}
void add(Component * p)
{
std::cout << "folder add file" << std::endl;
}
void remove(Component * p)
{
std::cout << "folder remove file" << std::endl;
}
void Show()
{
std::cout << "folder show all file" << std::endl;
}
};
int main()
{
Component * p = new Component("总文件夹");
p->add(new File("1.txt"));
p->add(new File("2.txt"));
Component * p1 = new Component("子文件夹1");
p1->add(new File("3.txt"));
p1->add(new File("4.txt"));
p->add(p1);
p->Show();
getchar()
return 0;
}