Composite objects into a tree structure so that individual objects and compositions of objects can be treated uniformly.
组合模式用于将对象(s)组合成一个树形结构,来表示部分-整体的层次关系(part-whole hierarchy),该设计模式允许客户以一个统一的方式对待每一个独立的对象或者由对象构成的容器(也即无论是独立的对象——叶子/部分/part,还是由这些对象组成的容器/whole,均继承自某一共同的抽象基类,获得相同的接口)。例如,我们磁盘上的文件/文件夹,即是这样一种结构。
实现上:
- (1)叶子节点(LeafNode):存储数据,不具备分支
- (2)内部节点(InternalNode):不存储数据,具备分支
- (3)叶子节点和内部节点,继承自统一的基类(Node)
含义上:
- (1)形成了局部-整体(part-whole)的递归结构
组合设计模式的 UML 类图如下:
现在我们用组合设计模式,模拟文件/文件夹
的目录结构。如刻画如下的目录结构:
class Component
{
public:
virtual ~Component() {}
virtual void traverse() = 0;
};
// 这里的继承
// 仅仅是获得统一的接口,也即是traverse,并无实际意义上的继承关系
class File :public Component
{
public:
File(const std::string& name):_name(name){}
void traverse() { std::cout << _name << ", "; }
private:
std::string _name;
};
// 同样这里的继承
// 仅仅是获得统一的接口,也即traverse,并无实际意义上的继承关系
class Folder :public Component
{
public:
void add(Component* item)
{ _children.push_back(item); }
void traverse()
{
for (auto elem: _children)
elem->traverse();
}
private:
std::vector<Component*> _children;
};
int main(int, char**)
{
Folder d1, d2;
File f1("file_1");
File f2("file_2");
File f3("file_3");
File f4("file_4");
d1.add(&f1);
d1.add(&f2);
d1.add(&d2);
d2.add(&f3);
d2.add(&f4);
d1.traverse();
std::cout << std::endl;
return 0;
};