定义
将对象组合成树型结构以表示“部分-整体”的层次结构。
案例
在我们的电脑中,文件加和文件就组成了我们的文件系统,文件夹之间可以互相包含,文件就像一个叶子节点,不能在包含其他的文件。要实现这样的关联,用普通的容器类来实现不好实现,它必须区别容器和内容,但是对于我们来说文件夹,文件的操作基本都是一样的,使用组合模式可以很好的实现:
类图中,File和Folder都是继承自Node,只不过File是一个叶子节点,不能再包含其他的节点,Folder节点是父节点,它可以包含其他的节点,也可以是空节点:
class Node {
public:
virtual void addChild(Node* node) = 0;
virtual void removeChild(Node* node) = 0;
virtual list<Node*>& childer() const = 0;
virtual const string& text() const = 0;
virtual Data* data() const = 0;
}
class File : public Node {
public:
virtual void addChild(Node* node) { }
virtual void removeChild(Node* node) { }
virtual list<Node*>& children() const { ... }
virtual const string& text() const { return text; }
virtual Data* data() const { return data; }
}
class Folder : public Node {
public:
virtual void addChild(Node* node) { addNode... }
virtual void removeChild(Node* node) { removeNode... }
virtual list<Node*> children() const { return children; }
virtual const string text() { return text; }
virtual Data* data() const { return NULL; }
}
Node* root = new Folder();
Node* myFolder = new Folder();
Node* file = new File();
myFolder->addNode(file);
root->addNode(myFolder);
适用性
- 想表示对象的部分-整体层次结构。
- 希望忽略组合对象与单个对象的不同,统一的使用组合结构中的对象。